Я пробовал проверить значение null, но компилятор предупреждает, что этого условия никогда не будет. Что я должен искать?
Я пробовал проверить значение null, но компилятор предупреждает, что этого условия никогда не будет. Что я должен искать?
Ответы:
Предполагая , что вы хотите , чтобы получить значение , если ключ делает существует, используйте Dictionary<TKey, TValue>.TryGetValue:
int value;
if (dictionary.TryGetValue(key, out value))
{
// Key was in dictionary; "value" contains corresponding value
}
else
{
// Key wasn't in dictionary; "value" is now 0
}
(Использование ContainsKeyа затем индексатор заставляет его дважды искать ключ, что довольно бессмысленно.)
Обратите внимание , что даже если вы были с помощью ссылочных типов, проверка на нуль не будет работать - индексатор для Dictionary<,>сгенерирует исключение , если вы запрашиваете недостающий ключ, а не возвращать нуль. (Это большая разница между Dictionary<,>и Hashtable.)
ContainsKey, что верно, потому что он также должен извлекать ценность. Однако он не выполняет двух поисков.
Словарь выдает KeyNotFoundисключение в случае, если словарь не содержит вашего ключа.
Как предполагается, ContainsKeyэто соответствующая мера предосторожности. TryGetValueтакже эффективен.
Это позволяет словарю более эффективно хранить нулевое значение. Без такого поведения проверка на нулевой результат от оператора [] будет указывать либо на нулевое значение, либо на отсутствие входного ключа, что не годится.
Если вы просто проверяете перед попыткой добавить новое значение, используйте ContainsKeyметод:
if (!openWith.ContainsKey("ht"))
{
openWith.Add("ht", "hypertrm.exe");
}
Если вы проверяете, существует ли значение, используйте TryGetValueметод, описанный в ответе Джона Скита.
GetValueElseAddметоды, которым вы задаете значение (или Func<TValue>), чтобы также сохранить разрешение на Insert, если вы собираетесь добавить, если его там нет. Я предполагаю, что причина, по которой он не вошел в библиотеки .NET, заключается в том, что путь добавления используется реже, если вы используете его в стиле кеширования]
TryGetValueэто будет лучше, но если вы хотите проверить, содержит ли словарь ключ, чтобы избежать дублирующих добавлений, я бы сказал, что ContainsKeyэто так же хорошо (если не лучше).
Вы должны проверить Dictionary.ContainsKey (int key), прежде чем пытаться извлечь значение.
Dictionary<int, int> myDictionary = new Dictionary<int, int>();
myDictionary.Add(2,4);
myDictionary.Add(3,5);
int keyToFind = 7;
if(myDictionary.ContainsKey(keyToFind))
{
myValueLookup = myDictionay[keyToFind];
// do work...
}
else
{
// the key doesn't exist.
}
TryGetValue. К счастью, сейчас знаю, так что буду знать в будущем. Я собираюсь оставить этот ответ нетронутым, потому что обсуждение полезно.
TryGetValueлямбда-выражения. Хотя это заставляет меня думать, что новое расширение C # будет catchоператором, похожим на nullоператор объединения .
Вспомогательный класс удобен:
public static class DictionaryHelper
{
public static TVal Get<TKey, TVal>(this Dictionary<TKey, TVal> dictionary, TKey key, TVal defaultVal = default(TVal))
{
TVal val;
if( dictionary.TryGetValue(key, out val) )
{
return val;
}
return defaultVal;
}
}
ContainsKey - это то, что вы ищете.
Вероятно, вам следует использовать:
if(myDictionary.ContainsKey(someInt))
{
// do something
}
Причина, по которой вы не можете проверить значение null, заключается в том, что ключ здесь является типом значения.
int result= YourDictionaryName.TryGetValue(key, out int value) ? YourDictionaryName[key] : 0;
Если ключ присутствует в словаре, он возвращает значение ключа, в противном случае возвращает 0.
Надеюсь, этот код тебе поможет.
TryGetValueдостаточно, используйте valueвместоresult
Рассмотрите вариант инкапсуляции этого конкретного словаря и предоставьте метод для возврата значения для этого ключа:
public static class NumbersAdapter
{
private static readonly Dictionary<string, string> Mapping = new Dictionary<string, string>
{
["1"] = "One",
["2"] = "Two",
["3"] = "Three"
};
public static string GetValue(string key)
{
return Mapping.ContainsKey(key) ? Mapping[key] : key;
}
}
Затем вы можете управлять поведением этого словаря.
Например, здесь: если в словаре нет ключа, он возвращает ключ, который вы передаете по параметру.