Как избежать ошибок нулевого ключа в словаре?

Как избежать ошибки, если ключ нулевой?

//Getter/setter
public static Dictionary<string, string> Dictionary
{
    get { return Global.dictionary; }
    set { Global.dictionary = value; }
}

ОБНОВЛЕНИЕ:

Dictionary.Add("Key1", "Text1");
Dictionary["Key2"] <-error! so what can I write in the GET to avoid error?

Спасибо.

С уважением


person eman    schedule 03.11.2010    source источник
comment
Код не подходит к вопросу... Где твой ключ?   -  person Yves M.    schedule 03.11.2010


Ответы (5)


Используйте 1_:

Dictionary<int, string> dict = ...;
string value;

if (dict.TryGetValue(key, out value))
{
    // value found
    return value;
}
else
{
    // value not found, return what you want
}
person Grozz    schedule 03.11.2010
comment
+1Используйте метод try. Не используйте метод contains, если вы хотите получить значение, это будет неэффективно, поскольку вы фактически выполните поиск дважды. - person Dog Ears; 04.11.2010
comment
Этот ответ неверен: TryGetValue выдает исключение, если ключ имеет значение null. - person andreisrob; 31.05.2018
comment
@JasonBaley не уверен, что это как-то связано с ответом, Dictionary не поддерживает нулевые ключи. Дополнительные обсуждения можно найти в этой теме: stackoverflow.com/questions/4632945 /словарь-с-нулевым-ключом - person Grozz; 01.06.2018
comment
@Grozz Вопрос заключался в том, как избежать ошибки, когда для поиска в словаре предоставляется нулевой ключ. Передача нулевого ключа в TryGetValue все равно вызовет ошибку, поэтому не отвечает на вопрос. В вашем ответе, если key равно нулю, создается исключение, так как же это относится к исходному вопросу? Он пытается избежать исключения. - person andreisrob; 01.06.2018
comment
@JasonBaley, пожалуйста, внимательно перечитайте весь вопрос, а не только заголовок. - person Grozz; 04.06.2018

Вы можете использовать метод Dictionary.ContainsKey.

Итак, вы бы написали:

if (myDictionary.ContainsKey("Key2"))
{
    // Do something.
}

Другие альтернативы — либо обернуть доступ в блок try...catch, либо использовать TryGetValue (см. примеры на странице MSDN).

string result = null;
if (dict.TryGetValue("Key2", out result))
{
    // Do something with result
}

TryGetMethod более эффективен, если вы хотите что-то сделать с результатом, поскольку вам не нужен второй вызов для получения значения (как в случае с методом ContainsKey).

(Конечно, в обоих методах вы замените «Key2» переменной.)

person ChrisF    schedule 03.11.2010
comment
Я имею в виду не в методе, а в объявлении! - person eman; 03.11.2010
comment
@eman - тогда я не понимаю твоего вопроса. Можете ли вы обновить код, чтобы точно показать, чего вы пытаетесь достичь? - person ChrisF; 03.11.2010

Метод расширения:

public static TValue GetValue<TKey, TValue>(this Dictionary<TKey, TValue> dic, TKey key)
{
    TValue result;
    return dic.TryGetValue(key, out result) ?
        result :
        default(TValue);
}

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

var dic = new Dictionary<string, string>
{
   { "key", "value" }
};

string r1 = dic.GetValue("key"); // "value"
string r2 = dic.GetValue("false"); // null
person abatishchev    schedule 03.11.2010

Ключ никогда не может быть нулевым в словаре. Словарь — это хеш-таблица, где по определению вам нужен непустой ключ, иначе хеш-функция не может сопоставить соответствующий элемент.

person Darin Dimitrov    schedule 03.11.2010
comment
как проверить, является ли он нулевым и вернуть пустую строку? - person eman; 03.11.2010
comment
Я думаю, это был его вопрос, как избежать установки null в качестве ключа... хотя его код не соответствует этому предположению. - person Bobby; 03.11.2010
comment
В вашем коде вы никогда не обращаетесь к словарю по ключу. Вы просто возвращаете статический словарь. Я не понимаю, что ты имеешь в виду. - person Darin Dimitrov; 03.11.2010
comment
@ Бобби, этого никогда не может случиться. Если вы попытаетесь использовать null в качестве ключа в словаре, вы получите ArgumentNullException, поэтому у вас никогда не будет словаря с нулевым ключом. - person Darin Dimitrov; 03.11.2010
comment
Да, я думаю, это был его вопрос, как избежать этого Исключения. - person Bobby; 03.11.2010

Вы возвращаете не ту вещь. Не возвращайте словарь, передайте ключ и верните значение.

public static string GetValue(string key)
{
    if(Global.dictionary.ContainsKey(key))
    {
        return Global.dictionary[key];
    }

    return ""; // or some other value
}
person DanDan    schedule 03.11.2010