2016-11-06 42 views
2

我試圖找到使用AND邏輯而不是OR邏輯在多個IEnumerable<T>集合中找到精確匹配的最優雅的方法。LINQ - 多個結果集的構建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); 

如何獲取包含包含的條款ALL只有冰淇淋,而不是其中任何IEnumerable<IceCream>

+0

像'myIceCreams.Where(I => i.Flavors.Contains(F)&& i.Nuts。包含(n)&& ...'。?我不是100%清楚你需要什麼。 – usr

回答

3

可以使用Intersect代替Concat

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

這將只返回在所有集合項目。

請記住,這取決於你平等的比較是如何實現的,你可能需要使用使用overload of Intersect with IEqualityComparer