gpt4 book ai didi

c# - 以编程方式构建 LINQ 查询而不用局部变量欺骗我

转载 作者:可可西里 更新时间:2023-11-01 08:16:22 25 4
gpt4 key购买 nike

假设我的对象处于完美的工作状态(即 TDD 让我认为它们可以工作)。

我有一个这样创建的列表(正确缩进除外):

var result = from v in vendors
from p in v.Products
orderby p.Name
select p;

这行得通 - 我从所有供应商处获得了所有产品。

现在我有了一个条件列表,由用户在运行时建立。让我们应用它们:

foreach (Attribute a in requiredAttributes)
{
result = result.Where(p => p.Attributes.Contains(a));
}

这可能很原始,但我认为它会起作用。但是,在此 foreach 循环完成后,当您枚举“结果”时,它将包含在其 Attributes 属性(也是一个集合)中具有 requiredAttributes 集合的 LAST 属性的所有产品。

对我来说,这听起来像是“a”在循环中的每一次旅行中都被某处覆盖,只有最后一次适用。

如果没有以某种方式为 IEnumerable 编写名为 ContainsAll(IEnumerable) 的扩展方法或类似的东西,我如何才能实现我想要的,这基本上是一个逻辑 AND,只给我那些具有所有必需属性的产品?

最佳答案

(为清楚起见进行了编辑。)

问题是 foreach 循环,以及每次都捕获并更改“a”变量的事实。这是一个可行的修改,通过为循环的每次迭代有效地引入一个"new"变量,并捕获该新变量。

foreach (Attribute a in requiredAttributes)
{
Attribute copy = a;
result = result.Where(p => p.Attributes.Contains(copy));
}

如果您可以使用 Omer 的解决方案,它会更简洁,但如果您的实际代码实际上更复杂,这可能会有所帮助:)

编辑:this closures article 中有更多关于该问题的信息- 向下滚动到“比较捕获策略:复杂性与功率”。

关于c# - 以编程方式构建 LINQ 查询而不用局部变量欺骗我,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/190227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com