如何检查字典中是否存在某个键值对?

30

如何检查一个键/值对是否存在于Dictionary<TKey,TValue>中? 我可以使用ContainsKeyContainsValue来检查是否存在键或值,但我不确定如何检查是否存在键/值对。

11个回答

47

如果 key 不存在,则无法存在 pair... 因此获取与该 key 相关联的值,并检查它是否是您要查找的值。例如:

// Could be generic of course, but let's keep things simple...
public bool ContainsKeyValue(Dictionary<string, int> dictionary,
                             string expectedKey, int expectedValue)
{
    int actualValue;
    if (!dictionary.TryGetValue(expectedKey, out actualValue))
    {
        return false;
    }
    return actualValue == expectedValue;
}

或者稍微更"聪明"一些(通常要避免这样做):

public bool ContainsKeyValue(Dictionary<string, int> dictionary,
                             string expectedKey, int expectedValue)
{
    int actualValue;
    return dictionary.TryGetValue(expectedKey, out actualValue) &&
           actualValue == expectedValue;
}

30

一个字典只支持每个键对应一个值,因此:

// key = the key you are looking for
// value = the value you are looking for
YourValueType found;
if(dictionary.TryGetValue(key, out found) && found == value) {
    // key/value pair exists
}

1
我稍微不喜欢在一个表达式中设置和使用“found”。 - CodesInChaos
我知道它很明确。这只是一种风格上的偏好。就像我尝试让每个语句只有一个副作用,而且这个副作用也是该语句中发生的最后一件事情。 - CodesInChaos

8
if (myDic.ContainsKey(testKey) && myDic[testKey].Equals(testValue))
     return true;

是的,它有效。但并不是很具有说明性。我选择这个来使逻辑清晰,而不是为了优化性能。 - Wesley Long
我们现在讨论的特定情况,不是关于(微)优化的问题。更多的是要理解.NET字典如何工作,O(k)复杂度等等。在这里使用trygetvalue是正确的做法。 - nawfal

4
你可以使用dictionary.TryGetValue来实现此操作。
Dictionary<string, bool> clients = new Dictionary<string, bool>();
                    clients.Add("abc", true);
                    clients.Add("abc2", true);
                    clients.Add("abc3", false);
                    clients.Add("abc4", true);

                    bool isValid = false;

                    if (clients.TryGetValue("abc3", out isValid)==false||isValid == false)
                    {
                        Console.WriteLine(isValid);
                    }
                    else
                    {
                        Console.WriteLine(isValid);
                    }

在上述代码中,if条件有两个部分,第一个部分用于检查键是否有值,第二个部分用于将实际值与您期望的值进行比较。
First Section{clients.TryGetValue("abc3", out isValid)==false}||Second Section{isValid == false}

2

简单通用的扩展方法

这是一个快速的通用扩展方法,可以为任何IDictionary添加一个ContainsPair()方法:

public static bool ContainsPair<TKey, TValue>(this IDictionary<TKey, TValue> dictionary,
                                                   TKey key,
                                                   TValue value)
{
    return dictionary.TryGetValue(key, out var found) && found.Equals(value);
}

这使您可以执行以下类似于字典的检查:

if( myDict.ContainsPair("car", "mustang") ) { ... }     // NOTE: this is not case-insensitive

不区分大小写的检查

在使用基于字符串的键时,可以通过在构建字典时使用比较器(例如StringComparer.OrdinalIgnoreCase)来使Dictionary在其键方面不区分大小写。

然而,要使值比较不区分大小写(假设值也是字符串),则可以使用此版本,它添加了一个IComparer参数:

public static bool ContainsPair<TKey, TValue>(this IDictionary<TKey, TValue> dictionary,
                                                   TKey key,
                                                   TValue value,
                                                   IComparer<TValue> comparer)
{
    return dictionary.TryGetValue(key, out var found) && comparer.Compare(found, value) == 0;
}

1

Jon Skeet的答案的通用版本

        public bool ContainsKeyValue<TKey, TVal>(Dictionary<TKey, TVal> dictionnaire,
                                             TKey expectedKey,
                                             TVal expectedValue) where TVal : IComparable
    {
        TVal actualValue;

        if (!dictionnaire.TryGetValue(expectedKey, out actualValue))
        {
            return false;
        }
        return actualValue.CompareTo(expectedValue) == 0;
    }

0

类似这样的东西怎么实现

bool exists = dict.ContainsKey("key") ? dict["key"] == "value" : false;

0

这个功能已经可以直接使用,但是它被隐藏在ICollection<KeyValuePair<TKey, TValue>>接口的Contains方法中,而这个接口被Dictionary<TKey,TValue>类实现。下面是如何将其作为public扩展方法公开:

public static bool Contains<TKey, TValue>(this Dictionary<TKey, TValue> dictionary,
    TKey key, TValue value)
{
    ArgumentNullException.ThrowIfNull(dictionary);
    return ((ICollection<KeyValuePair<TKey, TValue>>)dictionary).Contains(new(key, value));
}

在线演示


0
var result= YourDictionaryName.TryGetValue(key, out string value) ? YourDictionaryName[key] : "";

如果字典中存在该键,则返回该键的值,否则返回一个空对象。
希望这段代码能对您有所帮助。

-1

首先,您需要检查键是否存在,如果存在,则获取该键的值并将其与您正在测试的值进行比较... 如果它们相等,则您的字典包含该键值对


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接