LINQ C# 复杂嵌套结构

4

我成功从对象的复杂结构中进行了选择,但只能依靠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);
        }

1
问题在于你没有进行选择,而是更新了实际的项目。这是你想要的吗?你是否真的想要一个克隆的项目集,并设置Checks以你想要的方式? - James Thorpe
1
你是否正在寻找一种方法来选择具有“numbers”数组中任一值的ProductCrp对象?因为如果你试图获取顶层对象,你可以在传递的lambda表达式中使用where并向下钻取。(假设这是linq to objects)。如果这是linq to SQL,则需要考虑更多因素。 - peewee_RotA
1
Structure 不一致地拼错的原因是什么? - Eric Lippert
1
你能描述一下为什么在结尾添加了那个琐碎的 Select 吗?那不是总是错误的做法,但有点奇怪。这是怎么回事? - Eric Lippert
我根据字符串数组过滤数据,即可能有更多的数字,我需要显示与之匹配的符号,并删除多余的符号。 - Tibomso
显示剩余3条评论
2个回答

19
我设法从对象的复杂结构中进行选择,但只有通过 foreach 的帮助才能实现,如何避免使用 foreach 并解决我的问题,在只使用 LINQ 的情况下? 您不应该为此目的使用 LINQ。您正在正确使用 foreach LINQ 用于查询数据。 foreach 循环用于重复执行副作用。 您 foreach 的主体正在改变对象的属性; 那是一个更新而不是查询,因此您做得很对。 在这种情况下滥用 LINQ 是错误的,请勿这样做。
例如,答案建议使用 ToList 强制迭代具有副作用的查询是极其糟糕的风格,会导致代码效率低下,难以理解,难以维护,并且反对查询运算符的目的。 切勿滥用 LINQ。 我们在语言中内置了一种构造,可以表示“每个集合元素执行一次此操作”,称为 foreach。 使用它。

0
你是否在寻找类似这样的东西?
product.ForEach(item => item.Strucutre.CheckList.Checks = item.Strucutre.CheckList.Checks.Where(w => numbers.Contains(w.NumberAsInt)).Select(w => w).ToList());

这里的 ToList 函数有什么作用? - Eric Lippert
谢谢@Eric。这里不需要使用ToList,我只是认为“Checks”属性是List<Check>,但是“Where”返回的是IEnumerable<Check>,所以我使用了ToList将其转换为List<Check>。将“Check”属性更改为IEnumerable<Check>将避免使用ToList。 - Ayaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接