Словарь выдает исключение даже после проверки на ноль - PullRequest
4 голосов
/ 28 марта 2011

Я пытаюсь прочитать значение ключа из словаря, как показано ниже:

if (myDic["myKey"] != null)
{
}

Я вижу, что я проверяю на ноль, но даже тогда он выдает KeyNotFoundException.Как еще я должен это проверить?Пожалуйста, сообщите!

Ответы [ 8 ]

9 голосов
/ 28 марта 2011

Похоже, вы путаете поведение HashTable с Dictionary<TKey, TValue>. Класс HashTable вернет значение null, если ключ отсутствует, а Dictionary<TKey, TValue> сгенерирует исключение.

Вам нужно либо использовать ContainsKey, либо TryGetValue, чтобы избежать этой проблемы.

object value;
if (myDic.TryGetValue("apple", out value)) {
  ...
}
6 голосов
/ 28 марта 2011

использование

if(mydic.ContainsKey("myKey"))
3 голосов
/ 28 марта 2011

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

use:

if (myDic.ContainsKey("myKey")) {
}

или:

if (myDic.TryGetValue("myKey", out value)) {
}
1 голос
/ 28 марта 2011

Вы проверяете, является ли значение, связанное с ключом «яблоко», не null, а не в том случае, если словарь содержит ключ «яблоко». Для этого вы хотели бы использовать:

if( myDic.ContainsKey("apple") )
{

}
1 голос
/ 28 марта 2011
1 голос
/ 28 марта 2011

Использование:

if (myDic.ContainsKey("myKey"))  
{
}
0 голосов
/ 28 марта 2011

Вероятно, наиболее краткий способ сделать это заключается в следующем:

SomeType myVal;
if(myDic.TryGetValue("myKey",out myVal))
{
    //good to go
}
0 голосов
/ 28 марта 2011

Здесь следует использовать либо Contains, либо TryGetValue.

if (myDic.ContainsKey)
{
  // get value out of dictionary
  var myValue = myDic["myKey"];
}

или

string myValue;
if (myDic.TryGetValue("myKey", out myValue)
{
   // do something with myValue
}

[в приведенном выше примере предполагалось, что в вашем словаре есть значения типа string, но это может быть что угодно]

Преимущество второго подхода состоит в том, что вы можете как проверить, существует ли элемент в словаре, так и получить его значение как одну атомарную операцию, вместо того, чтобы сначала выполнять проверку Contains, а затем второй вызовполучить значение.

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