Я спробував перевірити нуль, але компілятор попереджає, що ця умова ніколи не відбудеться. Що я повинен шукати?
Я спробував перевірити нуль, але компілятор попереджає, що ця умова ніколи не відбудеться. Що я повинен шукати?
Відповіді:
Припускаючи , що ви хочете , щоб отримати значення , якщо ключ робить існує, використовуйте 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;
}
}
Тоді ви можете керувати поведінкою цього словника.
Наприклад тут: якщо в словнику немає ключа, він повертає ключ, який ви передаєте за параметром.