c# - LINQ - 为多个结果集构建 AND 与 OR 逻辑

标签 c# linq

我正在尝试找到在多个 IEnumerable<T> 中查找精确匹配的最优雅的方法。集合,使用 AND 逻辑,而不是 OR 逻辑。

示例

public class IceCream
{
    public string Flavor { get; set; } // "Vanilla", "Choc Chip", "Mint"
    public bool ContainsNuts { get; set; }
    public ServingType { get; set; } // "Cup", "Cone", "Waffle Cone"
    public SprinklesType { get; set; } // "Choc", "HundredsAndThousands", "EdibleBallBearings"
}

我的第一步是希望能够通过单独的搜索词获取所有可用的冰淇淋:

IEnumerable<IceCream> IceCreamsByFlavor { get; set; }
IEnumerable<IceCream> IceCreamsByContainsNuts { get; set; }
IEnumerable<IceCream> IceCreamsByServingType { get; set; }
IEnumerable<IceCream> IceCreamsBySprinklesType { get; set; }

现在,我可以将它们组合在一起以获得具有该术语的任何属性的冰淇淋集合:

return Enumerable.Empty<IceCream>()
    .Concat(IceCreamsByFlavor)
    .Concat(IceCreamsByContainsNuts)
    .Concat(IceCreamsByServingType)
    .Concat(IceCreamsBySprinklesType)
    .Distinct();

但是现在,假设我的搜索词是:

Search(
    flavor: "Vanilla",
    containsNuts: true,
    servingType: ServingType.WaffleCone,
    sprinklesType: SprinkesType.HundredsAndThousands);

如何获得 IEnumerable<IceCream>只包含包含全部个术语的冰淇淋,而不是任何个术语?

最佳答案

您可以使用Intersect而不是Concat:

return IceCreamsByFlavor
    .Intersect(IceCreamsByContainsNuts)
    .Intersect(IceCreamsByServingType)
    .Intersect(IceCreamsBySprinklesType);

它将仅返回所有集合中的项目。

请记住,根据相等比较的实现方式,您可能需要使用 overload of Intersect with IEqualityComparer

关于c# - LINQ - 为多个结果集构建 AND 与 OR 逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40449990/

相关文章:

wpf - 将 LINQ 查询结果(带有连接表)数据绑定(bind)到 DataGrid

c# - 如何用 LinQ 对自定义对象求和?

c# - EditorConfig - 简化 bool 评估?

c# - Assembly.LoadFrom之后的ResolveEventHandler

c# Linq - 这是删除记录的好设计吗?

c# - 如果应用程序是 winforms 或 asp.net,请使用预处理器检查

entity-framework - 加入 Entity Framework 和 F#

c# - 如何使用 LINQ 制作泛型函数?

c# - 鼠标悬停时更改图片

c# - LINQ 导致我的混淆器崩溃