Как проверить, существует ли пара «ключ-значение» в словаре - PullRequest
18 голосов
/ 11 марта 2012

Как можно проверить, существует ли пара «ключ / значение» в словаре <>?Я могу проверить, существует ли ключ или значение, используя ContainsKey и ContainsValue, но я не уверен, как проверить, существует ли пара ключ / значение.

Ответы [ 10 ]

38 голосов
/ 11 марта 2012

Ну, пара не может существовать, если ключ не существует ... поэтому извлеките значение, связанное с ключом, и проверьте, было ли это значение, которое вы искали за. Так, например:

// 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;
}
24 голосов
/ 11 марта 2012

Словарь поддерживает только одно значение для каждого ключа, поэтому:

// 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
}
6 голосов
/ 11 марта 2012
if (myDic.ContainsKey(testKey) && myDic[testKey].Equals(testValue))
     return true;
4 голосов
/ 03 ноября 2015

Вы можете сделать это, используя 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);
                    }

В приведенном выше коде, если условие содержит два раздела, первый для проверки ключа имеет значение, а второй для сравненияфактическое значение с вашим ожидаемым значением.

First Section{clients.TryGetValue("abc3", out isValid)==false}||Second Section{isValid == false}
0 голосов
/ 29 мая 2019
var result= YourDictionaryName.TryGetValue(key, out string value) ? YourDictionaryName[key] : "";

Если ключ присутствует в словаре, он возвращает значение ключа, в противном случае он возвращает пустой объект.

Надеюсь, этот код поможет вам.

0 голосов
/ 03 августа 2018

Простой общий метод расширения

Вот быстрый общий метод расширения, который добавляет метод ContainsPair() к любому IDictionary:

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

Проверка без учета регистра

При работе со строковыми ключами вы можете создать регистр Dictionary- нечувствителен к ключам, создавая его при помощи компаратора, например StringComparer.OrdinalIgnoreCase, при создании словаря.

Однако, чтобы сделать регистр нечувствительным к регистру (если значения также являются строками), вы можетеиспользуйте эту версию, которая добавляет параметр 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;
}
0 голосов
/ 16 ноября 2017

Общая версия ответа Джона Скита

        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 голосов
/ 14 марта 2017

Пожалуйста, проверьте с помощью следующего кода

var dColList = new Dictionary<string, int>();
if (!dColList.Contains(new KeyValuePair<string, int>(col.Id,col.RowId)))
{}

Спасибо, Махеш G

0 голосов
/ 11 марта 2012

Сначала вы проверяете, существует ли ключ, если да, вы получаете значение для этого ключа и сравниваете его со значением, которое тестируете ... Если они равны, ваш словарь содержит пару

0 голосов
/ 11 марта 2012

Как-то так

bool exists = dict.ContainsKey("key") ? dict["key"] == "value" : false;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...