【发布时间】:2014-07-11 23:57:30
【问题描述】:
我的主要对象是客户列表。由于我必须获取数据的方式,我需要合并两个列表,如下所示。余额清单包括所有客户的余额。基本上我想将与特定客户关联的余额添加到客户列表中。我正在尝试使用 Linq 根据它们的共同键 CustomerNumber 合并两者,但无法使其工作。
List<Customer> customers
List<Balance> balances
public class Customer
{
int CustomerNumber {get;set;}
List<Balance> Balances{get;set;}
}
public class Balance
{
int CustomerNumber {get;set;}
decimal Amount {get;set;}
}
所以让我们保存我有这个客户列表
List<Customer> customers = new List<Customer>{
new Customer {CustomerNumber = 1},
new Customer {CustomerNumber = 2},
new Customer {CustomerNumber = 3}
};
还有这个余额列表
List<Balance> balances = new List<Balance>{
new Balance {Amount = 10, CustomerNumber = 1},
new Balance {Amount = 20, CustomerNumber = 1},
new Balance {Amount = 30, CustomerNumber = 2},
new Balance {Amount = 80, CustomerNumber = 2},
new Balance {Amount = 100, CustomerNumber = 2},
new Balance {Amount = 50, CustomerNumber = 3},
};
最后我会有
- 客户 1 将有一个包含 10 和 20 金额的列表
- 客户 2 将有一个包含 30、80 和 100 金额的列表
- 客户 3 将有一个包含 50 数量的列表。
目前的解决方案如下:
foreach (var customer in customers)
{
var matchingBalances = balances
.Where(x => x.CustomerNumber == customer.CustomerNumber);
customer.Balances.AddRange(matchingBalances);
}
更新:这是我最终使用的。
var merge2 = customers.GroupJoin(balances,
c => c.CustomerNumber,
b => b.CustomerNumber,
(c, b) =>
{
c.Balances = b.ToList()
return c;
});
【问题讨论】:
-
嗯,这听起来像一个连接 - 那么你有什么尝试 - 你期望结果是什么?
-
我看到你评论了@KevinOwens 回答说你正在使用那个解决方案,在我看来这是处理这个问题的好方法。如果您希望优化现有功能,您应该将您已经在使用的功能以及您希望优化的具体方法、更快的处理速度、更低的内存占用等放在一起。
-
感谢您的提示。我的下一篇文章会更好!
-
我也在下面发布了
GroupJoin解决方案,这也可能有所帮助。 -
在 LINQ 中产生副作用是不好的做法。