2013-02-20 70 views
9

我試圖找出確定Dictionary<string, string>對象是否包含全部作爲鍵的一組string對象的最佳方法。確定字典是否包含所有的一組鍵

我可能不做所以這裏任何意義的使用明確的組字符串的一些示例代碼:

public static bool ContainsKeys(this Dictionary<string, string> dictionary) 
{ 
    return dictionary.ContainsKey("fname") && dictionary.ContainsKey("lname") && dictionary.ContainsKey("address1") && 
     dictionary.ContainsKey("city") && dictionary.ContainsKey("state") && dictionary.ContainsKey("zip"); 
} 

這裏的想法是接受字符串任意一組爲keys和檢查的鑰匙Dictionary<string, string>對象包含keys中的所有字符串。

我試圖下井這個LINQ道:雖然

public static bool ContainsKeys(this Dictionary<string, string> dictionary, string[] keys) 
{ 
    var query = from entry in dictionary 
       where keys.Contains(entry.Key) 
       select entry; 

    return query.Any(); 
} 

我不知道如果我在正確的道路上 - 我想,如果我想知道如果包含dictionary可能工作任何這些字符串作爲鍵。

回答

15

像這樣的東西應該符合您的要求。當然,對你的觀點進行適當的驗證。

return keys.Any() 
    && keys.All(key => dictionary.ContainsKey(key)); 

注:我有Any因爲All將返回如果源序列(鍵)本身就是空的。如果您不介意這一點,那麼請使用Any

+0

謝謝! 'keys.Any()'的加入對我來說是個好主意。 – 2013-02-20 21:54:12

+0

對於那些更喜歡縮短版本的人: 'return keys.Any() && keys.All(dictionary.ContainsKey);' – 2015-01-04 05:00:59

2

LINQ是這樣的事情確實不錯:

public static bool ContainsKeys(this Dictionary<string, string> dictionary, string[] keys) 
{ 
    return keys.All(dictionary.ContainsKey); 
} 
2

這可以非常簡單地使用All擴展方法來完成。

return keys.All(k => dictionary.ContainsKey(k)); 

這將檢查給定的謂詞(dictionary.ContainsKey(k))對給定陣列中的所有鍵來說。

0

這應該這樣做,只需使用Except來消除Dictionary中的密鑰,並檢查是否還有剩餘;

return !keys.Except(dictionary.Keys).Any(); 
相關問題