如何更快地优化以下代码?
How can I optimize the following code faster?
我有两个列表:
reports
计数 6000 和
invoices
计数 6000
我有这样的循环:
foreach (var item in reports)
{
item.SettlementProcessStatus =
invoices.Any(t => t.InvoiceId == item.RelatedInvoiceId)
? SettlementProcessStatus.Done
: SettlementProcessStatus.Error;
}
一开始这段代码速度还不错,但是索引越高越慢。
建议使用哪些解决方案来优化它?
不使用发票列表,而是使用以 RelatedInvoiceId 作为键值的 字典。
这避免了遍历所有列表项中的每一项。
性能问题是您的代码必须至少部分迭代每个报告的 invoices
。为避免这种情况,请先创建一个包含所有发票 ID 的 HashSet
,然后在其中而不是列表中进行搜索。
假设您有整数 ID,您可以这样做:
var invoiceIds = new HasSet<int>(invoices.Select(x => x.InvoiceId));
foreach (var item in reports)
item.SettlementProcessStatus = invoiceIds.Contains(item.RelatedInvoiceId) ?
SettlementProcessStatus.Done :
SettlementProcessStatus.Error;
我有两个列表:
reports
计数 6000 和
invoices
计数 6000
我有这样的循环:
foreach (var item in reports)
{
item.SettlementProcessStatus =
invoices.Any(t => t.InvoiceId == item.RelatedInvoiceId)
? SettlementProcessStatus.Done
: SettlementProcessStatus.Error;
}
一开始这段代码速度还不错,但是索引越高越慢。 建议使用哪些解决方案来优化它?
不使用发票列表,而是使用以 RelatedInvoiceId 作为键值的 字典。
这避免了遍历所有列表项中的每一项。
性能问题是您的代码必须至少部分迭代每个报告的 invoices
。为避免这种情况,请先创建一个包含所有发票 ID 的 HashSet
,然后在其中而不是列表中进行搜索。
假设您有整数 ID,您可以这样做:
var invoiceIds = new HasSet<int>(invoices.Select(x => x.InvoiceId));
foreach (var item in reports)
item.SettlementProcessStatus = invoiceIds.Contains(item.RelatedInvoiceId) ?
SettlementProcessStatus.Done :
SettlementProcessStatus.Error;