为了账号安全,请及时绑定邮箱和手机立即绑定

由于执行时间很长,我该怎么做才能使这个 foreach 循环运行得更快?

由于执行时间很长,我该怎么做才能使这个 foreach 循环运行得更快?

C#
倚天杖 2023-08-13 15:45:06
我该怎么做才能让这个循环运行得更快?    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 但在中间迷失了。有人可以帮忙吗?
查看完整描述

1 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

您可以从循环中提取,作为字典,而不是在每次迭代时查询: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 等的查询,那么它不是一个解决方案,并且您必须在每次迭代时调用它(因为数据可以更改)


查看完整回答
反对 回复 2023-08-13
  • 1 回答
  • 0 关注
  • 61 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信