C# LINQ比较列表并使用找到的对象中的值更新属性
我有两个对象类型相同的列表(假设列表A和B)。对象具有属性值。有没有办法使用linq比较第一个列表和第二个列表,当在列表B中找到列表A中的对象时(通过ID),更新列表A中对象的数量,并将其设置为旧值减去列表B中对象的数量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
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;}}我也会尝试蒂姆的解决方案。当做