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|)