我正在尝试使用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 ?
答案 0 :(得分:3)
您可以使用Intersect
代替Concat
:
return IceCreamsByFlavor
.Intersect(IceCreamsByContainsNuts)
.Intersect(IceCreamsByServingType)
.Intersect(IceCreamsBySprinklesType);
它只返回所有集合中的项目。
请注意,根据您实现相等比较的方式,您可能需要使用overload of Intersect
with IEqualityComparer