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 但“Where”返回 IEnumerable 所以我只是使用 ToList 将其转换为 List 。将“检查”属性设置为 IEnumerable 将避免 ToList。

以上是关于LINQ C# 复杂的嵌套结构的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 从具有嵌套数组的类中获取子属性值和父属性值

C#:循环遍历嵌套结构的成员对象

在 C# 中使用 Linq to XML 在文档中搜索不同的 XML 结构

System.Linq.Dynamic.Core - 查询嵌套对象

C# 表达式树的重要意义

C#之linq