2016-11-06 16 views
2

複数のIEnumerable<T>コレクション間でOR論理ではなくAND論理を使用して正確に一致するものを見つける最も洗練された方法を見つけようとしています。LINQ - 複数の結果セットのAND論理ANDロジック

私の最初のステップは、私は個々の検索条件で使用可能なすべてのアイスクリームを取得できるようにしたいということです

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用語のではなく、ANYそれらのが含まれている唯一のアイスクリームが含まれているIEnumerable<IceCream>を得るのですか?

+0

何かを使用するように使用する必要があります覚えておいてください。 (n)&& ... 'が含まれていますか?私はあなたが必要とするものについて100%明確ではありません。 – usr

答えて

3

かわりConcatIntersectを使用することができます。

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

それはすべてのコレクションにある項目のみを返します。

あなたの等価比較が実装されているかに応じて、あなたが=> i.Flavors.Contains(F)&& i.Nuts `myIceCreams.Where(私のようなoverload of Intersect with IEqualityComparer

関連する問題