我有2个具有相同对象类型的列表(让我们说列表A和B)。对象具有属性金额。有没有办法使用linq比较第一个列表和第二个列表,当列表A中的对象在列表B中找到(按ID),更新对象,在列表A中,金额并设置它是旧值减去列表B中的对象数量。
List A List B Result list
ID Name Amount ID Name Amount ID Name Amount
5 obj1 5 5 obj1 1 5 obj1 4
9 obj2 4 9 obj2 2 9 obj2 2
16 obj3 3 16 obj3 3 16 obj3 0
亲切的问候,
答案 0 :(得分:3)
listA.ForEach(obj =>
{
obj.Amount -= listB.SingleOrDefault(other => obj.Id == other.Id)?.Amount ?? 0;
}
如果有一个,则迭代listA并减去listB对应的Amount,否则减去0(什么都不做)。
答案 1 :(得分:2)
我会使用连接:
var query = from a in ListA join b in ListB on a.ID equals b.ID
select new{ A = a, NewValue = a.Amount - b.Amount };
foreach(var x in query)
x.A.Amount = x.NewValue;
这更有效,因为Join
使用基于集合的方法,并且只在必要时才更新。
答案 2 :(得分:0)
我会选择一个简单的循环,因为在这些情况下我发现它更具可读性(个人意见)
foreach(MyObj o in A)
{
IEnumerable<MyObj> supp = B.Where(b => b.Name == o.Name);
if(supp != null)
{
foreach(MyObj ob in supp)
{
o.Amount -= ob.Amount;
}
}
}