C# 使用linq更新列表中的列表
我有3个级别的列表,一个在另一个中,如下所示C# 使用linq更新列表中的列表,c#,linq,C#,Linq,我有3个级别的列表,一个在另一个中,如下所示 ProductResults ErrorNo ErrorString Products ProductNo ProductName SVNID ProductOrders OrderNo DateOfOrder UDEID 我想检查最低列表中UDEID的值。如果值是77,那么我想更新上面产品
ProductResults
ErrorNo
ErrorString
Products
ProductNo
ProductName
SVNID
ProductOrders
OrderNo
DateOfOrder
UDEID
我想检查最低列表中UDEID的值。如果值是77,那么我想更新上面产品列表中的SVNID。我怎样才能做到这一点?我在下面试过
ProductResultsList.Where(x => x.Products.Any(y => y.ProductOrders.Any(z => z.UDEID == 77))).ToList().
ForEach(u =>
{
u.Products.ForEach(v => v.SVNID = 90);
});
我的数据
ProductResultsList.ErrorNo = 0
ProductResultsList.ErrorString = ""
ProductResultsList.Products[0].ProductNo = "XY6789U"
ProductResultsList.Products[0].ProductName = "OrangeJuice"
ProductResultsList.Products[0].SVNID = 100
ProductResultsList.Products[0].ProductOrders[0].OrderNo = 201
ProductResultsList.Products[0].ProductOrders[0].DateOfOrder = 28/09
ProductResultsList.Products[0].ProductOrders[0].UDEID = 77
ProductResultsList.Products[1].ProductNo = "XY4569U"
ProductResultsList.Products[1].ProductName = "AppleJuice"
ProductResultsList.Products[1].SVNID = 100
ProductResultsList.Products[1].ProductOrders[0].OrderNo = 202
ProductResultsList.Products[1].ProductOrders[0].DateOfOrder = 28/09
ProductResultsList.Products[1].ProductOrders[0].UDEID = 88
上面的问题是它将所有Products.SVNID更新为90。我只想更新产品[0],而不是产品[1]。我确实理解为什么会这样,因为我的ForEach是ProductResults,但我不知道如何做我想做的事
请帮助您的问题在于第一个外部“Any”: 由于“条件”已满足,因为存在“任意”产品,其ProductOrder的UEID=77,因此您可以将所有ProductResult返回给ForEach 您应该将循环“插入”得更深一些,例如(未测试):
旁注:为什么不用常规方法提取呢?正如你所看到的,很难从一开始就追踪到底发生了什么。使用命名方法会更容易。尝试
u.Products[0]。SVNID=90代码>而不是u.Products.ForEach(v=>v.SVNID=90)代码>这将仅更新产品中的第一项。我想在整个列表中这样做。请注意,Linq中的Q表示“查询”。您正在尝试更新ForEach
不是Linq的一部分,因此您正在使用Linq(例如,Where
和任何
调用,但您的解决方案可能不涉及Linq。)。感谢这项工作——虽然我必须在ForEach之前添加ToList(),但这是一个完美的解决方案linq@user2837961请随意编辑我的答案,以放置正确的、经过测试的解决方案。我的答案是在我的(不是很理想的)头脑中编译的。我已经编辑了正确工作的答案
ProductResultsList.Where(x => x.Products.Any( 'condition'))
ProductResultsList.ForEach(productResult => {
productResult.Product.Where(product =>
product.Any('yourCondition')).ToList()
.ForEach('your action')