Что происходит с поиском C # Dictionary <int, int>, если ключ не существует? - PullRequest
105 голосов
/ 26 января 2010

Я попытался проверить на ноль, но компилятор предупреждает, что это условие никогда не произойдет. Что я должен искать?

Ответы [ 8 ]

172 голосов
/ 26 января 2010

Если вы хотите получить значение, если ключ существует , используйте Dictionary<TKey, TValue>.TryGetValue:

int value;
if (dictionary.TryGetValue(key, out value))
{
    // Key was in dictionary; "value" contains corresponding value
} 
else 
{
    // Key wasn't in dictionary; "value" is now 0
}

(Использование ContainsKey, а затем индексатор заставляет его искать ключ дважды, что довольно бессмысленно.)

Обратите внимание, что даже если вы использовали с использованием ссылочных типов, проверка на нулевое значение не сработала - индексатор для Dictionary<,> сгенерирует исключение, если вы запросите отсутствующий ключ, вместо того, чтобы вернуть нулевое значение. (Это большая разница между Dictionary<,> и Hashtable.)

23 голосов
/ 26 января 2010

Словарь выдает исключение KeyNotFound в том случае, если в словаре нет вашего ключа.

Как и предполагалось, ContainsKey является соответствующей мерой предосторожности. TryGetValue также эффективно.

Это позволяет словарю более эффективно хранить нулевое значение. Без такого поведения проверка на нулевой результат с помощью оператора [] будет указывать либо на нулевое значение, либо на отсутствие клавиши ввода, что не годится.

10 голосов
/ 26 января 2010

Если вы просто проверяете, прежде чем пытаться добавить новое значение, используйте метод ContainsKey:

if (!openWith.ContainsKey("ht"))
{
    openWith.Add("ht", "hypertrm.exe");
}

Если вы проверяете, существует ли значение, используйте метод TryGetValue, как описано в ответе Джона Скита.

2 голосов
/ 26 января 2010

Вы должны проверить Dictionary.ContainsKey (ключ int), прежде чем пытаться извлечь значение.

Dictionary<int, int> myDictionary = new Dictionary<int, int>();
myDictionary.Add(2,4);
myDictionary.Add(3,5);

int keyToFind = 7;
if(myDictionary.ContainsKey(keyToFind))
{
    myValueLookup = myDictionay[keyToFind];
    // do work...
}
else
{
    // the key doesn't exist.
}
0 голосов
/ 29 мая 2019
int result= YourDictionaryName.TryGetValue(key, out int value) ? YourDictionaryName[key] : 0;

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

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

0 голосов
/ 13 августа 2015

Подходит вспомогательный класс:

public static class DictionaryHelper
{
    public static TVal Get<TKey, TVal>(this Dictionary<TKey, TVal> dictionary, TKey key, TVal defaultVal = default(TVal))
    {
        TVal val;
        if( dictionary.TryGetValue(key, out val) )
        {
            return val;
        }
        return defaultVal;
    }
}
0 голосов
/ 26 января 2010

Вы, вероятно, должны использовать:

if(myDictionary.ContainsKey(someInt))
{
  // do something
}

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

0 голосов
/ 26 января 2010

ContainsKey - это то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...