我设法从对象的复杂结构中做出选择,但只有在foreach的帮助下,我怎样才能避免这个foreach并解决我的问题,只需使用LINQ?
var product = new List<ProductCrp>
{
new ProductCrp {
Strucutre = new StructureItem() {
CheckList = new CheckList() {
Checks = new List<Check>
{
new Check { NumberAsInt = "149" },
new Check { NumberAsInt = "260" },
new Check { NumberAsInt = null }
}
}
}
},
new ProductCrp {
Strucutre = new StructureItem() {
CheckList = new CheckList() {
Checks = new List<Check>
{
new Check { NumberAsInt = "261" },
new Check { NumberAsInt = "150" },
new Check { NumberAsInt = "260" }
}
}
}
}
};
string[] numbers = { "149" };
LINQ:
foreach (var item in product)
{
item.Strucutre.CheckList.Checks = item.Strucutre.CheckList.Checks.Where(w => numbers.Contains(w.NumberAsInt)).Select(w => w);
}
答案 0 :(得分:9)
我设法从对象的复杂结构中做出选择,但只有在foreach的帮助下,我怎样才能避免这个foreach并解决我的问题,只需使用LINQ?
您没有为此目的使用LINQ。您正确使用foreach
。
LINQ用于查询数据。 foreach
循环关于重复产生副作用。 foreach
的正文正在改变对象的属性;这是更新而不是查询,所以你做得对。使用LINQ是错误的;不要这样做。
例如,使用ToList
来强制查询带有副作用的查询的答案是非常糟糕的样式,导致代码效率低下,难以理解,难以维护,并且违背查询运算符的目的。永远不要滥用LINQ。我们在语言中内置了一个构造,意味着每个集合元素执行一次这个操作&#34;,它被称为foreach
。使用它。
答案 1 :(得分:0)
你在找这样的东西吗?
product.ForEach(item => item.Strucutre.CheckList.Checks = item.Strucutre.CheckList.Checks.Where(w => numbers.Contains(w.NumberAsInt)).Select(w => w).ToList());