Подтвердить что ты не робот

Лучший способ справиться с KeyNotFoundException

Я использую словарь для выполнения поиска для программы, над которой я работаю. Я запускаю кучу ключей через словарь, и я ожидаю, что некоторые ключи не будут иметь значения. Я поймаю KeyNotFoundException прямо там, где это происходит, и поглощает его. Все остальные исключения будут распространяться на вершину. Это лучший способ справиться с этим? Или я должен использовать другой поиск? Словарь использует int как свой ключ, а пользовательский класс - как его значение.

4b9b3361

Ответ 1

Используйте Dictionary.TryGetValue вместо:

Dictionary<int,string> dictionary = new Dictionary<int,string>();
int key = 0;
dictionary[key] = "Yes";

string value;
if (dictionary.TryGetValue(key, out value))
{
    Console.WriteLine("Fetched value: {0}", value);
}
else
{
    Console.WriteLine("No such key: {0}", key);
}

Ответ 2

Попробуйте использовать:   Dict.ContainsKey

Изменить:
Производительность мудрая, я думаю, что Dictionary.TryGetValue лучше, чем некоторые другие, но я не люблю использовать Out, когда мне это не нужно, по моему мнению. ContainsKey более читабельна, но требует больше строк кода, если вам тоже нужно значение.

Ответ 3

Решение в одной строке с использованием TryGetValue

string value = dictionary.TryGetValue(key, out value) ? value : "No key!";

Имейте в виду, что значение переменной должно иметь тип, который словарь возвращает в этой строке. Здесь вы не можете использовать var для объявления переменных.

Если вы используете С# 7, в этом случае вы МОЖЕТЕ включить переменную и определить ее inline:

string value = dictionary.TryGetValue(key, out var tmp) ? tmp : "No key!";

Ответ 4

Вот решение с одной строкой (Имейте в виду, что это делает поиск дважды. См. Ниже версию tryGetValue, которая должна использоваться в длительных циклах.)

string value = dictionary.ContainsKey(key) ? dictionary[key] : "default";

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

string value = dictionary[key] ?? "default";//this doesn't work

Ответ 5

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