有没有办法提高这两个foreach循环的性能?

时间:2017-08-01 17:00:52

标签: c# linq foreach

我目前正致力于为客户提供帮助更新客户信息的应用程序。 Customers查询返回最少500个结果。 CustomerItemList是一个单独的项目列表。两个列表都包含Customer PK。我需要合并customerPK匹配的这两个列表。请注意,客户pk可以在客户项目列表中多次列出,这一点非常重要!下面的代码片段有效,但速度很慢。我希望用linq更新它,但我还没有发现任何能提高性能的东西。

提前感谢您的帮助!

            var Customers = LookupCustomers(CustomerItemList); //returns 500

            foreach (var customer in Customers)
            {
                var CustomerIDList = CustomerItemList.Where(x => x.CustomerPK.Equals(customer.CustomerPK)).ToList(); //returns at least 2 results
                foreach (var CustomerID in CustomerIDList)
                {
                    CustomerID.CustomerPrimaryCard = customer.PrimaryCardID + ", 1";
                }
            }

3 个答案:

答案 0 :(得分:1)

尝试将CustomerItemList转换为词典:

var customersDict = CustomerItemList.GroupBy(c => c.CustomerPK)
    .ToDictionary(k => k.Key, v => v.ToList());

然后在foreach中使用此代码:

foreach (var customer in Customers)
{
    List<CustomerItem> items; // not sure about elements type of CustomerItemList
    if (!customersDict.TryGetValue(customer.CustomerPK, out items))
        continue;

    foreach (var CustomerID in items)
        CustomerID.CustomerPrimaryCard = customer.PrimaryCardID + ", 1";
}

答案 1 :(得分:1)

你可以试试这个:

Customers
    .Join(CustomerItemList, c => c.CustomerPK, i => i.CustomerPK, (c, i) => new { Customer = c, Item = i })
    .ToList()
    .ForEach(r => { r.Item.CustomerPrimaryCard = r.Customer.PrimaryCardID + ", 1"; });

或者,你可以试试这个:

Customers
    .Join(CustomerItemList, c => c.CustomerPK, i => i.CustomerPK, (c, i) => new { Customer = c, Item = i })
    .AsParallel()
    .ForAll(r => { r.Item.CustomerPrimaryCard = r.Customer.PrimaryCardID + ", 1"; });

但如果您有大量结果和/或资源密集型操作,则最好使用并行处理。否则,它实际上会更慢。

一般的想法是使用Set操作。

答案 2 :(得分:0)

如果您的CustomerItemList很大,请按搜索标准CustomerPK对其进行预先排序,并使用BinarySearch检索搜索项目的第一次出现。从那里开始迭代并打破第一个不匹配的CustomerPK