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

Другие вопросы по тегам