Лучший способ обработать KeyNotFoundException
Я использую словарь для поиска программы, над которой я работаю. Я запускаю связку ключей через словарь и ожидаю, что некоторые ключи не будут иметь значения. Я ловлю KeyNotFoundException
прямо там, где это происходит, и впитайте это. Все остальные исключения будут распространяться наверх. Это лучший способ справиться с этим? Или я должен использовать другой поиск? Словарь использует int в качестве ключа и пользовательский класс в качестве значения.
6 ответов
Использование 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);
}
Попробуйте использовать: Dict.ContainsKey
Редактировать:
Я думаю, производительность Dictionary.TryGetValue
лучше, чем некоторые другие, но я не люблю использовать Out, когда мне не нужно, так что, по моему мнению, ContainsKey более читабелен, но требует больше строк кода, если вам также нужно это значение.
Однолинейное решение с использованием TryGetValue
string value = dictionary.TryGetValue(key, out value) ? value : "No key!";
Имейте в виду, что значение переменной должно иметь тип, который словарь возвращает в этой строке. Здесь вы не можете использовать var для объявления переменных.
Вот решение, состоящее из одной строки (Имейте в виду, что это делает поиск дважды. См. Ниже версию tryGetValue, которая должна использоваться в длительных циклах.)
string value = dictionary.ContainsKey(key) ? dictionary[key] : "default";
И все же мне приходится делать это каждый раз, когда я получаю доступ к словарю. Я бы предпочел, чтобы он возвращал null, поэтому я могу просто написать:
string value = dictionary[key] ?? "default";//this doesn't work
Я знаю, что это старая ветка, но в случае, если она полезна, предыдущие ответы хороши, но можно рассмотреть комментарии о сложности и проблемах с засорением кода (все это также актуально для меня).
Я использую собственный метод расширения, чтобы обернуть сложность вышеприведенных ответов в более элегантную форму, чтобы она не была засорена в коде, а затем обеспечивает отличную поддержку оператора null coalesce.,, в то же время максимизируя производительность (через ответы выше).
namespace System.Collections.Generic.CustomExtensions
{
public static class DictionaryCustomExtensions
{
public static TValue GetValueSafely<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key)
{
TValue value = default(TValue);
dictionary.TryGetValue(key, out value);
return value;
}
}
}
Затем вы можете использовать его, просто импортировав пространство имен System.Collections.Generic.CustomExtensions
string value = dictionary.GetValueSafely(key) ?? "default";
Вы должны использовать метод "ContainsKey(string key)" в Словаре, чтобы проверить, существует ли ключ. Использование исключений для нормального выполнения программы не считается хорошей практикой.