我目前正致力于为客户提供帮助更新客户信息的应用程序。 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";
}
}
答案 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