2013-02-20 2 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()» - хорошая идея для меня. –

+0

Для тех, кто предпочитает сокращенную версию: 'return keys.Any() && keys.All (dictionary.ContainsKey);' –

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