C# 我该怎么做才能使这个foreach循环运行得更快,因为它需要很长时间才能执行?
我能做些什么使这个循环运行得更快C# 我该怎么做才能使这个foreach循环运行得更快,因为它需要很长时间才能执行?,c#,multithreading,performance,for-loop,foreach,C#,Multithreading,Performance,For Loop,Foreach,我能做些什么使这个循环运行得更快 private void accessVendorGridData() { try { foreach (var item in getAllVendorList) { item.CurrencyName = "USD"; // Fetch Addresses in Vendor Grid
private void accessVendorGridData()
{
try
{
foreach (var item in getAllVendorList)
{
item.CurrencyName = "USD";
// Fetch Addresses in Vendor Grid
var Addr = _vendorservice.GetAllVendorAdd().Where(x => x.vendorId == item.Id).ToList();
if (Addr.Count > 0)
{
item.VendorAddressLine = String.Format("{0}, {1}, {2}, {3}, {4}", Addr[0].Address, Addr[0].City, Addr[0].StateProvince, Addr[0].ZipPostalCode, Addr[0].CountryRegion);
}
// Fetch Payment terms in Vendor Grid
var paymentTerm = _vendorservice.GetAllPaymentTerms().Where(x => x.Id == item.PaymentTermId).ToList().SingleOrDefault();
if (paymentTerm != null)
{
item.paymenttermitem = paymentTerm.Name;
}
// Fetch Tax Scheme in Vendor Grid
var taxscheme = _vendorservice.GetAllTaxScheme().Where(x => x.Id == item.TaxschemeId).ToList().SingleOrDefault();
if (taxscheme != null)
{
item.TaxschemeName = taxscheme.TaxSchemaName;
}
}
}
catch (Exception ex)
{
_exLog.AddErrorLog(ex, "NewVendor, accessVendorGridData()");
ModernDialog.ShowMessage(ex.Message, "Error!", MessageBoxButton.OK);
}
}
我能做些什么使这个循环运行得更快?我试过了,但在两者之间迷失了方向。有人能帮忙吗
private void accessVendorGridData()
{
foreach (var item in getAllVendorList)
{
var Addr = _vendorservice.GetAllVendorAdd().Where(x => x.vendorId == item.Id).ToList();
var paymentTerm = _vendorservice.GetAllPaymentTerms().Where(x => x.Id == item.PaymentTermId).ToList().SingleOrDefault();
var taxscheme = _vendorservice.GetAllTaxScheme().Where(x => x.Id == item.TaxschemeId).ToList().SingleOrDefault();
}
}
您可以从循环中将供应商
、付款条件
和所有税务方案
提取为字典,而不是在每次迭代时进行查询:
时间复杂性,这个有
O(|getAllVendorList| + |vendors| + |paymentTerms| + |allTaxSchemes|)
但是,如果\u vendorservice.GetXXX()
是对服务、RDBMS等的查询,并且您必须在每次迭代时调用它(因为数据可以更改)而不是在每次迭代时查询,您可以从循环中提取供应商
、支付条款
和所有税务方案
,作为字典:
时间复杂性,这个有
O(|getAllVendorList| + |vendors| + |paymentTerms| + |allTaxSchemes|)
但是,如果
\u vendorservice.GetXXX()
是对服务、RDBMS等的查询,并且您必须在每次迭代时调用它(因为数据可以更改)首先要做的是:测量该循环是否真的是一个瓶颈,或者您是否觉得它很慢,因为逐行通过调试器需要一些时间。除此之外,我们无法回答这个问题,因为我们不知道循环中的方法做什么,以及这些方法是否会导致性能下降。长话短说:使用探查器,例如DotTrace。从删除物化开始:.ToList()
,但改用Any()
。为了获得准确答案,我们还需要知道供应商服务.ToList().SingleOrDefault()
中的内容。SingleOrDefault()
不需要ToList()当你想要一个单独的项目时,你好像在每次迭代中调用“代码> GETALLMODRORADOD/<代码>,<代码> GETALAUPMENTAN条款和 GETALLATAGTIONS < /COD>。你可以考虑从循环中提取这个通用代码,并将结果在列表或数组中实现。首先要做的是:测量这个循环是否真的是阿纳尔。eneck,或者如果您只是觉得它很慢,因为逐行通过调试器需要一些时间。除此之外,我们无法回答这个问题,因为我们不知道循环中的方法做了什么,以及这些方法是否会导致性能差。长话短说:使用探查器,例如DotTrace。从删除物化开始:.ToList()
但要使用Any()
来代替。为了得到准确的答案,我们还需要知道vendorservice
.ToList().SingleOrDefault()
到.SingleOrDefault()
中没有必要使用ToList()当你想要一个单独的项目时,阿纳尔似乎在每次迭代中调用<代码> GATALVANDORADOD/<代码>,<代码> GETAALAppAdTunes < /C>和 GETALLATION方案。你可以考虑从循环中提取这个共同的代码,并将其结果在列表或数组中实现。谢谢代码“DmirtyBychenko……几乎所有的东西都是”工作正常,但部分var Addr=vendors.TryGetValue(item.Id,out var addrs)?addrs:new List();没有输出。@Abhishek Thakur:如果我们有一个供应商列表vendors.TryGetValue(item.Id,out var addrs)?
我们返回它-?Addr
,如果没有(未知item.Id
)我们返回一个空列表-:new list();
。请输入正确的类型,而不是Vendor
感谢代码@DmirtyBychenko…几乎所有内容都正常工作,但部分var Addr=vendors.TryGetValue(item.Id,out var addrs)?addrs:new list();没有输出。@Abhishek Thakur:如果我们有一个供应商列表供应商.TryGetValue(item.Id,out var addrs)?
我们返回它-?addr>,如果没有(未知项目.Id
),我们返回一个空列表-:新列表();
。请输入正确的类型,而不是供应商
O(|getAllVendorList| + |vendors| + |paymentTerms| + |allTaxSchemes|)