Próbowałem sprawdzić pod kątem null, ale kompilator ostrzega, że ten warunek nigdy nie wystąpi. Czego powinienem szukać?Co dzieje się ze słownikiem C# <int, int>, jeśli klucz nie istnieje?
Odpowiedz
Zakładając chcesz uzyskać wartość wtedy, gdy klucz robi istnieje, użyj 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
}
(Korzystanie ContainsKey
a następnie bibliotekarz sprawia, że dwa razy spojrzeć klawisz w górę, co jest dość bezcelowe.)
Należy pamiętać, że nawet jeśli były użyciu typów referencyjnych, sprawdzanie wartości null nie będzie działać - bibliotekarz dla Dictionary<,>
rzuci wyjątek, jeśli poprosisz brakującego klucza, zamiast wracać puste. (Jest to duża różnica między Dictionary<,>
i Hashtable
.)
Jeśli jesteś po prostu sprawdzenie przed próbuje dodać nową wartość, należy użyć metody ContainsKey
:
if (!openWith.ContainsKey("ht"))
{
openWith.Add("ht", "hypertrm.exe");
}
Jeśli sprawdzenie, czy wartość istnieje, użyj metody TryGetValue
jak opisano w odpowiedzi Jon Skeet za .
TryGet lepiej –
Bo jesteś rozwiązywania kluczową odnośnika poprzez hashtable dwukrotnie jeśli natychmiast uzyskać po Zawiera. Wintellect PowerCollections ma również metody "GetValueElseAdd", które dajesz wartość (lub 'Func
@rub: Myślę, że to zależy od celu kodu. Jeśli chcesz użyć wartości, zgadzam się, że 'TryGetValue' byłaby lepsza, ale jeśli chcesz sprawdzić, czy słownik zawiera klucz w celu uniknięcia duplikowania dodatków, powiedziałbym, że' ContainsKey' jest równie dobry (jeśli nie lepszy). –
Powinieneś sprawdzić Dictionary.ContainsKey (klawisz int) przed próbą wyciągnięcia wartości.
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.
}
Dlaczego chcesz zrobić to dwa razy? –
@Jon, ponieważ zwykle czyta się lepiej – mookid8000
@mookid: Nie według mnie. Chodzi o to, aby spróbować wyszukać klucz i podjąć jeden kurs akcji, jeśli zostanie znaleziony, a inny sposób działania w przeciwnym razie, prawda? –
ContainsKey jest tym, czego szukasz.
Należy prawdopodobnie użyć:
if(myDictionary.ContainsKey(someInt))
{
// do something
}
Powodem, dlaczego nie można sprawdzić null jest, że kluczem tutaj jest typ wartości.
Typ wartości jest nieco nieistotny, ponieważ sprawdzanie wartości zerowej nie przyniosłoby pożądanego efektu. –
@Johannes, rozwiązanie Jona jest oczywiście o wiele lepsze, ale osoba pytająca oświadczyła, że sprawdził, czy klucz istnieje, i jest to słownik
Słownik generuje wyjątek KeyNotFound
w przypadku, gdy słownik nie zawiera klucza.
Zgodnie z sugestią, odpowiednim środkiem ostrożności jest ContainsKey
. TryGetValue
jest również skuteczny.
Dzięki temu słownik może efektywniej przechowywać wartość null. Bez zachowywania się w ten sposób, sprawdzenie zerowego wyniku z operatora [] wskaże albo wartość pustą, albo nieistnienie klucza wejściowego, co nie jest dobre.
Dodatkowe informacje można znaleźć na stronie MSDN: http://msdn.microsoft.com/en-gb/library/9tee9ht2.aspx – cyberzed
Klasa pomocnik jest przydatny:
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;
}
}
- 1. C++ - Co się dzieje, jeśli konstruktor jest prywatny?
- 2. Co się dzieje ze wskaźnikami w tym urywku?
- 3. Co dzieje się z zewnętrzną funkcją inline?
- 4. C# DropDownList ze słownikiem jako DataSource
- 5. Powiązanie modelu ze Słownikiem <ciąg, ciąg> w Nancy
- 6. Co się dzieje w __libc_start_main?
- 7. Dodaj klucz do rejestru, jeśli nie istnieje
- 8. Co się tutaj dzieje? sizeof (short_int_variable + char_variable)
- 9. Wydajność zapytania; nie wiem, co się dzieje
- 10. Co dzieje się w tym oświadczeniu zwrotu?
- 11. Co się dzieje, jeśli mam kilka nakładających QTimer
- 12. Co się dzieje, gdy moja() jest warunkowa?
- 13. Co zwróci $ _GET ['klucz'], jeśli klucz nie jest ustawiony?
- 14. Co dzieje się w BeginProcessRequest()?
- 15. Korzystanie parę <int, int> jako klucz do mapy
- 16. Niejawna konwersja nie dzieje się
- 17. Co tak naprawdę się dzieje, gdy kompiluję int main; w C
- 18. Co dzieje się na stosie lub sterty?
- 19. Czy istnieje różnica między std :: map <int, int> a std :: map <const int, int>?
- 20. para <int,int> pary jako klucz unordered_map emisji
- 21. Kombinator parser nie kończy się - jak rejestrować co się dzieje?
- 22. Co się dzieje (lub nie dzieje się) w karcie chrome otwartej w tle?
- 23. Unary "~" operator - Co dokładnie się tutaj dzieje?
- 24. Co dzieje się z wyłączoną obsługą przerwań?
- 25. Co się dzieje z tą składnią pythona? (c == cw s)
- 26. Powiązanie listy rozwijanej w mvc3 ze słownikiem?
- 27. MySQL: Wstaw, jeśli istnieje klucz obcy
- 28. SQLAlchemy zmiana jeśli unikalny klucz istnieje
- 29. EventHandler: Co się dzieje w tym kodzie?
- 30. INotifyPropertyChanged: co dzieje się za sceną?
@JonSkeet To nie TryGetValue również wykonuje podwójne wyszukiwanie ([jak podano w treści tego pytania] (http://stackoverflow.com/questions/1413304/net-adding-dictionary-item-check-if-it-exists- lub-allow-exception))? – nawfal
@nawfal: Nie widzę żadnego wskazania, że to pytanie w ogóle stwierdza. Mówi, że robi więcej pracy niż 'ContainsKey', co jest prawdą, ponieważ musi również wyodrębnić wartość. Nie robi jednak dwóch poszukiwań. –
Naiwnie oczekiwałem wartości null, ale dla Dictionary zwraca to odpowiednik "0" w wyliczeniu. –
Jess