Próbowałem sprawdzić wartość null, ale kompilator ostrzega, że ten warunek nigdy nie wystąpi. Czego powinienem szukać?
c#
dictionary
deltanovember
źródło
źródło
ContainsKey
, co jest prawdą, ponieważ musi również wydobyć wartość. Nie robi to jednak dwóch wyszukiwań.Słownik zgłasza
KeyNotFound
wyjątek w przypadku, gdy słownik nie zawiera klucza.Jak sugerowano,
ContainsKey
jest to odpowiednie środki ostrożności.TryGetValue
jest również skuteczny.Dzięki temu słownik może efektywniej przechowywać wartość null. Bez takiego zachowania sprawdzanie wyniku zerowego z operatora [] wskazywałoby albo wartość zerową, albo brak klucza wejściowego, co nie jest dobre.
źródło
Jeśli sprawdzasz tylko przed próbą dodania nowej wartości, użyj
ContainsKey
metody:Jeśli sprawdzasz, czy wartość istnieje, użyj
TryGetValue
metody opisanej w odpowiedzi Jona Skeeta.źródło
GetValueElseAdd
metody, którym podajesz wartość (lub aFunc<TValue>
), aby również zapisać rozdzielczość we wkładce, jeśli zamierzasz dodać, jeśli jej tam nie ma. Domyślam się, że powodem, dla którego nie trafił do bibliotek .NET, jest to, że ścieżka dodawania jest rzadsza, jeśli używasz jej w stylu pamięci podręcznej]TryGetValue
byłoby lepiej, ale jeśli chcesz sprawdzić, czy słownik zawiera klucz, aby uniknąć podwójnych dodatków, powiedziałbym, żeContainsKey
jest równie dobry (jeśli nie lepszy).Powinieneś sprawdzić Dictionary.ContainsKey (int key) przed próbą wyciągnięcia wartości.
źródło
TryGetValue
. Na szczęście teraz tak, więc będę wiedział w przyszłości. Mam zamiar pozostawić tę odpowiedź bez zmian, chociaż dyskusja jest cenna.TryGetValue
w wyrażeniu lambda. Chociaż to sprawia, że myślę, że nowe rozszerzenie C # byłobycatch
operatorem podobnym donull
operatora koalescencji.Klasa pomocnicza jest przydatna:
źródło
ContainsKey jest tym, czego szukasz.
źródło
Powinieneś prawdopodobnie użyć:
Powodem, dla którego nie możesz sprawdzić null, jest to, że klucz tutaj jest typem wartości.
źródło
Jeśli klucz jest obecny w słowniku, zwraca wartość klucza, w przeciwnym razie zwraca 0.
Mam nadzieję, że ten kod ci pomoże.
źródło
TryGetValue
wystarczy, użyjvalue
zamiastresult
Rozważ opcję hermetyzacji tego konkretnego słownika i podaj metodę zwracania wartości dla tego klucza:
Następnie możesz zarządzać zachowaniem tego słownika.
Na przykład tutaj: jeśli słownik nie ma klucza, zwraca klucz, który przekazujesz przez parametr.
źródło