2013-02-20 78 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(); 
相关问题