2012-01-20 3 views
3

を使用してブール結果を取得するallIngredの中にピザの成分が存在する場合、結果はLINQを使用してtrueになります。これをどうやってやりますか?LinQコード

string[] allIngred = { 
    "oil", "yeast", "wheat-flour", "salt", "oil", "baking-powder", 
    "wheat-flour", "salt", "sugar", "milk" 
}; 
string[] pizza = { "oil", "yeast", "wheat-flour", "salt" }; 

答えて

3

あなたはpizza内のすべての項目がallIngredに存在することを確認するためにAllContainsの方法を組み合わせて使用​​することができます。

bool result = pizza.All(i => allIngred.Contains(i)); 
1
bool result = pizza.Intersect(allIngred).SequenceEqual(pizza); 

Intersect()次の2つのアレイ間で共有されているメンバーのすべてを与え、SequenceEqual()は、結果セットが(このケースでは、すべてのピザかどうかを確認したい提供引数と同じであるかどうかを識別するすべての成分が含まれています)。あなたは配列を逆ならば、これは必ずしも動作しないこと

注:

bool result = allIngred.Intersect(pizza)… 

Intersectの結果セットが最初の引数に応じて注文した、とあなたはpizzaと一致する結果が必要になりますので。

順序は保証されませんIEnumerable<T>、に対処するため、より安全になり、明示的に注文を追加:この特定の要件については

bool result = pizza.Intersect(allIngred).OrderBy(x => x).SequenceEqual(pizza.OrderBy(x => x)); 

、あなただけのに対してIntersect()に呼び出した後、アイテムのCount()をチェックして最適化することができますpizza配列の長さ。

1

あなたはLINQののset operatorsの一部を使いたいように聞こえます。これらはあなたが正しい方向に始めることができます。

特にLinqのIntersectオペレータをチェックしてください。交差の結果が気になるピザの成分と等しい場合は、必要なすべての成分があることがわかります。

2

は、私はあなたが何を意味するか、100%わからないんだけど、私はこれが役に立てば幸い:LINQを使用して、いくつかの可能なアプローチがありますが

if (pizza.Intersect(allIngred).Count() == pizza.Count()){ 
    Console.WriteLine("All pizza ingredients exist"); 
} 
1

、そのうちのいくつかは他のものよりも高価です。通常交差点と「すべて」のアプローチよりも高速に実行されます何かのために、以下試してください。

bool result = !pizza.Except(allIngred).Any(); 
0

あなたはこれらのタイプの操作の多くを実行したい時に、より良い方法だろうHashSet<string>にこれら二つの配列を変換します。

ISet<string> allIngred = new HashSet<string>() { ... items ...}; 
ISet<string> pizza = new HashSet<string>() { ... items ... }; 

bool haveIngredients = pizza.IsSubset(allIngred); 
関連する問題