LINQ C#复杂的嵌套结构

时间:2017-11-20 17:22:40

标签: c# linq

我设法从对象的复杂结构中做出选择,但只有在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);
        }

2 个答案:

答案 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());