LINQ C# 复杂的嵌套结构
Posted
技术标签:
【中文标题】LINQ C# 复杂的嵌套结构【英文标题】:LINQ C# complex nesting structure 【发布时间】:2017-11-20 17:22:39 【问题描述】:我设法从对象的复杂结构中做出选择,但只有在 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);
【问题讨论】:
这里的问题是您不是在进行选择,而是在更新实际项目。这是你想要的吗?你真的想要一个克隆的项目集合,Checks
设置你想要的方式吗?
那么,你想达到什么样的结果?
您是否正在寻找一种方法来选择具有 Checks 数组中“数字”值之一的 ProductCrp 对象?因为如果您试图获取***对象,您可以只做一个 where 并在您传入的 lambda 中向下钻取。(假设这是对象的 linq)。如果这是 linq to SQL,这里还有很多考虑因素。
Structure
拼写不一致是否有原因?
你能描述一下为什么你在最后附加了琐碎的Select
吗?这不是总是错误的做法,但它有点奇怪。那是怎么回事?
【参考方案1】:
我设法从对象的复杂结构中做出选择,但只有在 foreach 的帮助下,我怎样才能避免这种 foreach 并解决我的问题,只使用 LINQ?
您不要为此目的使用 LINQ。您正确使用了foreach
。
LINQ 用于查询 数据。 foreach
循环是关于反复产生副作用。 foreach
的主体正在改变对象的属性;这是一个更新,而不是一个查询,所以你做对了。为此使用 LINQ 是错误的;不要这样做。
例如,使用ToList
来强制迭代具有副作用的查询的答案是非常糟糕的样式,并导致代码效率低下、难以理解、难以理解维护,并违背查询运算符的目的。永远不要像那样滥用 LINQ。我们在语言中内置了一个结构,意思是“每个集合元素执行一次此操作”,它被称为foreach
。使用它。
【讨论】:
【参考方案2】:你在寻找这样的东西吗?
product.ForEach(item => item.Strucutre.CheckList.Checks = item.Strucutre.CheckList.Checks.Where(w => numbers.Contains(w.NumberAsInt)).Select(w => w).ToList());
【讨论】:
ToList
在这里面的作用是什么?
谢谢@Eric..这里 ToList 不是必需的,我只是认为“Checks”属性是 List以上是关于LINQ C# 复杂的嵌套结构的主要内容,如果未能解决你的问题,请参考以下文章
在 C# 中使用 Linq to XML 在文档中搜索不同的 XML 结构