Niedawno zauważyłem Dictionary.TryGetValue(TKey key, out TValue value)
i byłem ciekawy, które jest lepsze podejście do pobierania wartości ze słownika.
Tradycyjnie robiłem:
if (myDict.Contains(someKey))
someVal = myDict[someKey];
...
chyba że wiem, że musi tam być.
Czy lepiej po prostu zrobić:
if (myDict.TryGetValue(somekey, out someVal)
...
Która praktyka jest lepsza? Czy jeden jest szybszy od drugiego? Wyobrażam sobie, że wersja Try byłaby wolniejsza, ponieważ „połyka” próbę / haczyk wewnątrz siebie i używa jej jako logiki, nie?
źródło
W rzeczywistości TryGetValue jest szybsze. O ile szybciej? To zależy od posiadanego zbioru danych. Po wywołaniu metody Contains Dictionary przeprowadza wewnętrzne wyszukiwanie w celu znalezienia indeksu. Jeśli zwróci wartość true, potrzebujesz kolejnego przeszukania indeksu, aby uzyskać rzeczywistą wartość. Gdy używasz TryGetValue, przeszukuje indeks tylko raz, a jeśli zostanie znaleziony, przypisuje wartość do zmiennej.
Edytować:
Ok, rozumiem twoje zamieszanie, więc pozwól mi rozwinąć:
Przypadek 1:
if (myDict.Contains(someKey)) someVal = myDict[someKey];
W tym przypadku istnieją 2 wywołania funkcji FindEntry, jedno w celu sprawdzenia, czy klucz istnieje i jedno w celu jego odzyskania
Przypadek 2:
myDict.TryGetValue(somekey, out someVal)
W tym przypadku istnieje tylko jedno wywołanie FindKey, ponieważ wynikowy indeks jest przechowywany do faktycznego pobierania w tej samej metodzie.
źródło
Wyobrażam sobie, że trygetvalue robi coś bardziej jak:
if(myDict.ReallyOptimisedVersionofContains(someKey)) { someVal = myDict[someKey]; return true; } return false;
Miejmy nadzieję, że nigdzie nie próbuj / łapaj.
Myślę, że to naprawdę wygodna metoda. Generalnie używam go, ponieważ zapisuje jeden lub dwa wiersze kodu.
źródło