确定字典是否包含一组关键字中的所有关键字

本文关键字:关键字 字典 是否 包含一 | 更新日期: 2023-09-27 18:00:22

我正试图找出确定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是否包含这些字符串中的任何一个作为键,我想这可能会奏效。

确定字典是否包含一组关键字中的所有关键字

这样的东西应该能满足您的要求。当然,对你的论点进行适当的验证。

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

注意:我包含Any,因为如果源序列(密钥)实际上为空,All将返回true。如果你不介意,那么就取消使用Any

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

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

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

LINQ确实很适合这类事情:

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

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

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

要扩展已接受的答案,以下是适用于任何类型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));
        }
    }
}