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

时间:2016-11-06 13:43:18

标签: c# linq

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

示例

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>,而不是 ANY

1 个答案:

答案 0 :(得分:3)

您可以使用Intersect代替Concat

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

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

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