2012-01-20 31 views
3

如果比薩餅的成分存在於allIngred之間,則結果將通過使用LINQ給出true。我會如何去做這件事?使用LinQ代碼檢索bool結果

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

回答

3

可以使用的AllContains相結合的方法來檢查,在pizza所有項目中存在allIngred

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

Intersect()給大家,在兩個陣列之間共享的成員,並SequenceEqual()識別結果集是一樣的提供的參數(在這種情況下,你想看看所有比薩餅成分全部消失)。

請注意,如果你扭轉數組這不一定會工作:

bool result = allIngred.Intersect(pizza)… 

因爲Intersect結果集將根據第一個參數進行排序,你需要的結果相匹配pizza

增加訂貨明確將用於處理IEnumerable<T>,其中排序不能保證安全:

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

對於這個特殊的要求,你可以通過只檢查項目的Count(),來電後Intersect()對優化pizza數組的長度。

1

這聽起來像你想使用一些的LINQ的set operators的。這些將使你開始朝正確的方向發展。

特別是,檢查Linq的Intersect運營商。如果交叉的結果與您關心的披薩的配料相同,那麼您知道您擁有所有需要的配料。

2

我不是100%肯定你的意思,但我希望這有助於:

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

雖然有使用LINQ幾種可能的方法,他們中的一些人比其他人更昂貴。的東西,通常會跑的比交集和「所有」的方法更快,請嘗試以下操作:

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);