LINQ比较列表和更新属性与找到​​的对象的值

时间:2018-03-28 13:59:35

标签: c# linq

我有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

亲切的问候,

3 个答案:

答案 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;
     }
   }
}