[英]What can I do to make this foreach loop run faster as it takes long time to execute?
我该怎么做才能使这个循环运行得更快?
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);
}
}
我该怎么做才能使这个循环运行得更快? 我试过 Parallel.ForEach 但在两者之间输了。 有人可以帮忙吗?
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();
}
}
而不是在每次迭代,你可以提取查询vendors
, paymentTerms
和allTaxSchemes
从环路词典:
private void accessVendorGridData() {
var vendors = _vendorservice
.GetAllVendorAdd()
.GroupBy(item => item.Id)
.ToDictionary(chunk => chunk.Key, chunk => chunk.ToList());
var paymentTerms = _vendorservice
.GetAllPaymentTerms()
.GroupBy(item => item.Id)
.ToDictionary(chunk => chunk.Key, chunk => chunk.SingleOrDefault());
var allTaxSchemes = _vendorservice
.GetAllTaxScheme()
.GroupBy(item => item.Id)
.ToDictionary(chunk => chunk.Key, chunk => chunk.SingleOrDefault());
foreach (var item in getAllVendorList) {
var Addr = vendors.TryGetValue(item.Id, out var addrs)
? addrs
: new List<Vendor>(); //TODO: put the right type instead of Vendor
var paymentTerm = paymentTerms.TryGetValue(item.PaymentTermId, out var term)
? term
: null;
var taxscheme = allTaxSchemes.TryGetValue(item.PaymentTermId, out var scheme)
? scheme
: null;
}
}
您当前的代码有
O(|getAllVendorList| * (|vendors| + |paymentTerms| + |allTaxSchemes|))
时间复杂度,这个有
O(|getAllVendorList| + |vendors| + |paymentTerms| + |allTaxSchemes|)
但是,如果_vendorservice.GetXXX()
是对服务、RDBMS 等的查询,并且您必须在每次迭代时调用它,则这不是解决方案(因为数据可以更改)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.