Dlaczego firma Microsoft nie zapewniła ogólnej implementacji narzędzia OrdersDictionary?
Widziałem kilka niestandardowych implementacji, w tym: http://www.codeproject.com/KB/recipes/GenericOrdersDictionary.aspx
Ale dlaczego Microsoft nie zawarł go w podstawowej bibliotece .net? Z pewnością mieli powód, by nie budować generycznego ... ale co to jest?
Przed opublikowaniem tej wiadomości widziałem: /programming/2629027/no-generic-implementation-of-ordereddictionary
Ale to tylko potwierdza, że nie istnieje. Nie, dlaczego to nie istnieje.
Dzięki
SortedDictionary<TKey, TValue>
: msdn.microsoft.com/en-us/library/f7fta44c.aspxOdpowiedzi:
W C # 4.0 W pigułce czytam to:
OrderedDictionary
jest kombinacją aHashTable
iArrayList
ArrayList
ArrayList
Klasa nieogólna jest używana głównie ze względu na kompatybilność wsteczną z Framework 1.x ...”ArrayList
jest funkcjonalnie podobna doList<object>
”ArrayList
niż nieogólne niżList<object>
”Wniosek?
Żadna ogólna,
OrderedDictionary
ponieważ jej podstawowa konstrukcja jest (nieoficjalnie) zdeprecjonowaną klasą, która nie ma samej wersji ogólnej.źródło
OrderedDictionary
kowariancji i wariancji kontra?Do
OrderedDictionary
przeciążenia operacja indeksowania tak że indeksowanie z całkowitąN
dostanie element w pozycjiN
, podczas indeksowania ze związkiemObject
będzie odzyskać pozycję coresponding do tego obiektu. Gdyby stworzyćOrderedDictionary<int, string>
nazywamyDict
i dodał egzemplarze (1, „George”) i (0, „Fred”) w tej kolejności, należymyDict[0]
wrócić „George” lub „Fred”?Taki problem można rozwiązać, nakładając ograniczenie klasy na typ klucza. Z drugiej strony duża część użyteczności zbiorów ogólnych wynika z ich zdolności do wydajnej pracy z typami wartości. Nałożenie ograniczenia klasowego na typ klucza wydaje się trochę brzydkie.
Gdyby klasa nie musiała być zgodna z CLS, ale po prostu musiała współpracować z vb.net, rozsądnym projektem mogłoby być użycie nazwanych właściwości indeksowanych. Tak więc w powyższym przykładzie
myDict.ByKey[0]
dałbym „Fred”, amyDict.BySequence[0]
dałby „George”. Niestety, języki takie jak C # nie obsługują nazwanych indeksowanych właściwości. Podczas gdy można było zakłócać coś, co pozwala na użycie powyższej składni, nawet bez takich właściwości, niefortunna decyzja o zawinięciu pól struktur takich jakPoint
iRectangle
oznacza, żemyDict.ByKey[0] = "Wally"
aby działać,myDict.ByKey
musiałaby zwrócić obiekt nowej klasy. Struktura byłaby bardziej wydajna, ale kompilatory odrzuciłyby coś, co wyglądało jak zapis do struktury tylko do odczytu (mimo że właściwość nie zmodyfikowałaby struktury zwróconej przezByKey
, ale zamiast tego zmodyfikuj kolekcję, do której zawiera odwołanie).Osobiście uważam, że dobrze byłoby mieć słownikowy obiekt, który został określony jako śledzenie kolejności wstawiania; Chciałbym również mieć obiekt słownikowy, który mógłby łatwo zwrócić klucz powiązany z określonym kluczem (tak, że np. Jeśli ktoś ma słownik bez rozróżniania wielkości liter i dodał rekord z kluczem „GEORGE”, jeden może zapytać słownik, który klucz jest powiązany z „George”, bez konieczności przeszukiwania wszystkich
KeyValuePair
obiektów zwróconych w wyliczeniu.źródło
Ponieważ utrzymanie porządku uniemożliwia wyszukiwanie w O (1), które implikuje IDictionary, chyba że opakujesz dwie kolekcje (jedna dla porządku, jedna dla wyszukiwania), co powoduje, że dodawanie / usuwanie jest mniej wydajne i zwiększa użycie pamięci. Lub możesz mieć wolniejsze wyszukiwanie w zamian za mniejsze zużycie pamięci.
Domyślam się, że nie było tutaj „wyraźnie lepszego” wyboru, więc nie poszedł do standardowej biblioteki. Zwłaszcza około 2.0, C # wciąż uczył się na błędach Javy. Nie zdziwiłbym się, gdyby podejście Java do „wszystkiego i zlewu kuchennego” do kolekcji w ich standardowej bibliotece również było postrzegane jako coś, czego należy unikać.
źródło
OrderedDictionary
aList
. Wyobrażam sobie, że każdy, kto ma uzasadniony przypadek użycia dla,OrderedDictionary
używa go konkretnie, ponieważ potrzebuje klasy kolekcji, która ma wyszukiwanie O (1), ale także pamięta kolejność wstawiania, w którym to przypadku użycie dodatkowej pamięci jest nieuniknione, a zatem dopuszczalne.