Я спробував перевірити нуль, але компілятор попереджає, що ця умова ніколи не відбудеться. Що я повинен шукати?
Я спробував перевірити нуль, але компілятор попереджає, що ця умова ніколи не відбудеться. Що я повинен шукати?
Відповіді:
Припускаючи , що ви хочете , щоб отримати значення , якщо ключ робить існує, використовуйте 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
також є ефективним.
Це дозволяє словнику ефективніше зберігати значення null. Без того, щоб він поводився таким чином, перевірка наявності нульового результату від оператора [] вказувала б або нульове значення АБО відсутність ключа введення, що не є корисним.
Якщо ви просто перевіряєте, перш ніж намагатися додати нове значення, скористайтеся ContainsKey
методом:
if (!openWith.ContainsKey("ht"))
{
openWith.Add("ht", "hypertrm.exe");
}
Якщо ви перевіряєте, чи існує значення, використовуйте TryGetValue
метод, описаний у відповіді Джона Скіта.
GetValueElseAdd
методи, яким ви даєте значення (або а Func<TValue>
), щоб також зберегти роздільну здатність на Вставці, якщо ви збираєтесь додати, якщо її немає. Я здогадуюсь, що причина, чому він не потрапив у .NET libs, полягає в тому, що шлях додавання рідше, якщо ви використовуєте його в стилі кешу]
TryGetValue
було б краще, але якщо ви хочете перевірити, чи містить словник ключ, щоб уникнути повторюваних доповнень, я б сказав, що ContainsKey
це так само добре (якщо не краще).
Ви повинні перевірити Dictionary.ContainsKey (клавіша int), перш ніж намагатися витягнути значення.
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
}
Причина, по якій ви не можете перевірити нуль, полягає в тому, що ключ тут є типом значення.
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;
}
}
Тоді ви можете керувати поведінкою цього словника.
Наприклад тут: якщо в словнику немає ключа, він повертає ключ, який ви передаєте за параметром.