Szukałem w pewnym kodzie mój współpracownik zameldowaliśmy, wyglądało to tak:Dlaczego słownik .Net wygląda tak, jak jest posortowany?
return list.OrderBy(item => item.Order).ToDictionary(item => item.Id);
razu powiedziałem mojemu współpracownikowi, że jego kod jest niewłaściwy, ponieważ Dictionary
jest tabela hash, niebędącego -sortowana kolekcja. Powinien albo użyć kolekcji zachowującej porządek, albo posortować przedmioty później, czytając je ze słownika z foreach
, powiedziałem.
Ale on odpowiedział "Nie, nie, mój kod jest poprawny! Słuchaj: teraz, gdy dodałem OrderBy
, pozycje pojawiają się we właściwej kolejności."
Okazuje się, że w sprawie testowej miał rację. Próbowałem na innych danych, ale wciąż było idealnie posortowane!
Powiedziałem mu, że nie powinien polegać na tym zachowaniu, ale nie zgadza się on, i mam problemy z wyjaśnieniem dlaczego. Poza tym jestem zainteresowany tym, dlaczego zamówienie tak często wydaje się być zachowane.
Moje pytanie brzmi: Dlaczego Dictionary
, zasadniczo nieposortowana kolekcja, wygląda tak bardzo, że jest posortowana?
słownik <> nie daje gwarancji, że kolekcja jest nieuporządkowana . Nie używa Losowo celowo. Tak, kod jest nieprawidłowy. –
tak Justin, to jest duplikat. Odpowiedź na pytanie, które łączysz, jest tym, czego pragnęłam. Jak szybko znaleźć duplikaty wśród tak wielu pytań na temat słowników? Szukałem i nie mogłem go znaleźć. Dziękuję Ci! –
Nie wiem (dlatego zamieszczam to jako komentarz), ale wyobrażam sobie, że jest taki sam jak w SQL: wiersze zwrócone przez 'SELECT' są zwracane w nieokreślonej kolejności, chyba że dołączono klauzulę" ORDER BY " . Często, szczególnie w małych zestawach danych, wiersze są zwracane w takiej samej kolejności, w jakiej zostały wstawione, co powoduje przemieszczenie wielu osób. (Zawsze mówię ludziom, aby dodawali "ZAMÓWIENIE PRZEZ", jeśli w ogóle dbają o porządek wyników. * Może * działać bez niego, ale może również przerwać się strasznie.) –