确定Dictionary是否包含所有一组键

时间:2013-02-20 20:35:27

标签: c# .net linq

我试图找出最佳方法来确定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是否包含任何这些字符串作为键,这可能会有效。

5 个答案:

答案 0 :(得分:24)

这样的事情应该符合你的要求。当然,在你的论点周围应用适当的验证。

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

注意:我包含Any,因为如果源序列(键)实际为空,All将返回 true 。如果您不介意,请不要使用Any

答案 1 :(得分:3)

LINQ对于这类事情确实很好:

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

答案 2 :(得分:3)

这可以通过All扩展方法非常简单地完成。

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

这将检查给定谓词(dictionary.ContainsKey(k))对于给定数组中的所有键是否为真。

答案 3 :(得分:1)

这应该这样做,只需使用Except来消除Dictionary中的密钥并检查是否遗留了任何内容;

return !keys.Except(dictionary.Keys).Any();

答案 4 :(得分:0)

要扩展accepted answer,以下是扩展方法的完整源代码,该方法适用于任何类型的Dictionary,而不仅仅是一个带字符串键的扩展方法:

using System.Linq;

namespace System.Collections.Generic
{

    /// <summary>
    /// 
    /// </summary>
    public static class IDictionaryExtensions
    {

        public static bool ContainsKeys<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, IEnumerable<TKey> keys)
        {
            return keys.Any() && keys.All(key => dictionary.ContainsKey(key));
        }

    }

}