Что происходит с С# Dictionary <int, int> lookup, если ключ не существует?

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

Ответ 1

Предполагая, что вы хотите получить значение, если ключ существует, используйте 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, а затем индексщик заставляет его дважды смотреть ключ, что довольно бессмысленно.)

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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.
}

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

Класс помощника удобен:

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