亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

由于執行時間很長,我該怎么做才能使這個 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 關注
  • 125 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號