繁体   English   中英

我该怎么做才能使这个 foreach 循环运行得更快,因为它需要很长时间才能执行?

[英]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();
            }
    }

而不是在每次迭代,你可以提取查询vendorspaymentTermsallTaxSchemes从环路词典

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM