20

我试图找出确定一个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");
}

这里的想法是接受任意一组字符串 askeys并检查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包含任何这些字符串作为键,这可能会起作用。

4

5 回答 5

31

像这样的东西应该满足你的要求。当然,围绕你的论点应用适当的验证。

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

注意:我包括Any,因为如果源序列(键)实际上是空的,All将返回true 。如果您不介意这一点,请消除使用Any.

于 2013-02-20T20:38:11.180 回答
5

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

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

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

于 2013-02-20T20:40:07.160 回答
4

LINQ 确实适合这种事情:

public static bool ContainsKeys(this Dictionary<string, string> dictionary, string[] keys)
{
  return keys.All(dictionary.ContainsKey);
}
于 2013-02-20T20:38:50.777 回答
1

应该这样做,只需使用Except消除其中的键Dictionary并检查是否有任何剩余;

return !keys.Except(dictionary.Keys).Any();
于 2013-02-20T20:42:23.893 回答
0

为了扩展接受的答案,这里是一个扩展方法的完整源代码,它适用于任何类型的字典,而不仅仅是一个带有字符串键的字典:

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

    }

}
于 2018-03-31T22:06:24.100 回答