Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ比较列表并使用找到的对象中的值更新属性_C#_Linq - Fatal编程技术网

C# LINQ比较列表并使用找到的对象中的值更新属性

C# LINQ比较列表并使用找到的对象中的值更新属性,c#,linq,C#,Linq,我有两个对象类型相同的列表(假设列表A和B)。对象具有属性值。有没有办法使用linq比较第一个列表和第二个列表,当在列表B中找到列表A中的对象时(通过ID),更新列表A中对象的数量,并将其设置为旧值减去列表B中对象的数量 List A List B Result list ID Name Amount ID Name Amount ID Name

我有两个对象类型相同的列表(假设列表A和B)。对象具有属性值。有没有办法使用linq比较第一个列表和第二个列表,当在列表B中找到列表A中的对象时(通过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
亲切问候,

listA.ForEach(obj => 
{
    obj.Amount -= listB.SingleOrDefault(other => obj.Id == other.Id)?.Amount ?? 0;
}
这将迭代listA并减去listB对应的金额(如果有),否则减去0(不执行任何操作)


这将迭代listA并减去listB对应的金额(如果有),否则减去0(不做任何操作)。

我会选择一个简单的循环,因为我发现在这些情况下它更可读(个人观点)

foreach(A中的MyObj o)
{
IEnumerable supp=B.Where(B=>B.Name==o.Name);
如果(supp!=null)
{
foreach(MyObj ob辅助)
{
o、 金额-=观察金额;
}
}
}

我会选择一个简单的循环,因为我发现在这些情况下它更具可读性(个人观点)

foreach(A中的MyObj o)
{
IEnumerable supp=B.Where(B=>B.Name==o.Name);
如果(supp!=null)
{
foreach(MyObj ob辅助)
{
o、 金额-=观察金额;
}
}
}
我会使用连接:

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
使用基于集合的方法,并且仅在必要时进行更新。

我会使用Join:

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
使用基于集合的方法,并且仅在必要时进行更新。

您已经尝试过什么?请包括您的代码,它不起作用。如果列表B中有多个ID相同的代码呢?谢谢大家的回答,首先,我使用了简单的两个foreach循环,但我认为可能有一种消耗较少的方法,因为在中,这些列表可能会很大。是的,在清单B foreach(完整材料清单中的a条){foreach(已用材料清单中的B条){if(a.ArticleID==B.ArticleID){a.ArticleAmount=a.ArticleAmount-B.ArticleAmount;}}我也会尝试蒂姆的解决方案。你已经试过什么了?请包括您的代码,它不起作用。如果列表B中有多个ID相同的代码呢?谢谢大家的回答,首先,我使用了简单的两个foreach循环,但我认为可能有一种消耗较少的方法,因为在中,这些列表可能会很大。是的,在清单B foreach(完整材料清单中的a条){foreach(已用材料清单中的B条){if(a.ArticleID==B.ArticleID){a.ArticleAmount=a.ArticleAmount-B.ArticleAmount;}}我也会尝试蒂姆的解决方案。当做