Znajduję to SortedList<TKey, TValue>
SortedDictionary<TKey, TValue>
i Dictionary<TKey, TValue>
wdrażam te same interfejsy.
- Kiedy powinniśmy zdecydować się na
SortedList
iSortedDictionary
nadDictionary
? - Jaka jest różnica między
SortedList
iSortedDictionary
pod względem zastosowania?
c#
generics
dictionary
sortedlist
sorteddictionary
Oddzielać się
źródło
źródło
Odpowiedzi:
Podczas iteracji po elementach w jednym z dwóch elementów zostaną posortowane. Nie tak z
Dictionary<T,V>
.MSDN rozwiązuje różnicę między
SortedList<T,V>
iSortedDictionary<T,V>
:źródło
SortedList
można wyszukiwać według indeksu (w przeciwieństwie do wyszukiwania za pomocą klucza), aw przypadkuSortedDictionary
nie można.Wspomniałbym o różnicy między słownikami.
Powyższe zdjęcie pokazuje, że
Dictionary<K,V>
jest to w każdym przypadku równe lub szybsze niżSorted
analogowe, ale jeśli wymagana jest kolejność elementów, np. Do ich wydrukowania,Sorted
wybiera się jeden.Źródło: http://people.cs.aau.dk/~normark/oop-csharp/html/notes/collections-note-time-complexity-dictionaries.html
źródło
Immutable
wersjami tych słowników,Sorted
wersje są często w rzeczywistości szybsze o około 40-50% niż nieposortowane odpowiedniki (nadalO(log(n))
, ale zauważalnie szybsze na operację) . Czasy mogą się jednak różnić w zależności od tego, jak posortowane jest wejście. Zobacz stackoverflow.com/a/30638592/111575Podsumowując wyniki testu wydajności - SortedList vs. SortedDictionary vs. Dictionary vs. Hashtable , wyniki od najlepszego do najgorszego dla różnych scenariuszy:
Zużycie pamięci:
Wstawki:
Operacje wyszukiwania:
operacje pętli foreach
źródło
Collection
musi byćsorted
wtedy można zapomnieć oHashtable
iDictionary
: jeśli wypełnić swoją kolekcję w jednym ujęciu -> przejdź do SortedList, ale jeśli przewidywania będą często trzeba.Add
i.Remove
elementy -> przejdź do SortedDictionary.sorted
znaczy: kiedy robisz aFor Each MyItem in Collection
zamiast przetwarzać je w kolejności, w jakiej pierwotnie tworzyłeś.Add
, asorted
Collection
przetwarzasz je w kolejności według kryteriów dotyczącychKey
wartości (określonych wIComparer
). Na przykład, jeśli twoje klucze są ciągami, wtedy Twoja kolekcja będzie domyślnie przetwarzana w kolejności alfabetycznej twoich kluczy, ale zawsze możesz zdefiniować niestandardową regułę sortowania.Widzę, że proponowane odpowiedzi koncentrują się na wydajności. Poniższy artykuł nie zawiera żadnych nowych informacji dotyczących wydajności, ale wyjaśnia podstawowe mechanizmy. Należy również zauważyć, że nie koncentruje się na trzech
Collection
typach wymienionych w pytaniu, ale dotyczy wszystkich typów wSystem.Collections.Generic
przestrzeni nazw.http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class.aspx
Ekstrakty:
Słownik <>
SortedDictionary <>
SortedList <>
Wstępne podsumowanie podstawowych procedur
Opinie są mile widziane, ponieważ jestem pewien, że nie wszystko ułożyło się dobrze.
n
.Słownik
Pamięć
KeyArray(n) -> non-sorted array<pointer>
ItemArray(n) -> non-sorted array<pointer>
HashArray(n) -> sorted array<hashvalue>
Dodaj
HashArray(n) = Key.GetHash
nr O (1)KeyArray(n) = PointerToKey
nr O (1)ItemArray(n) = PointerToItem
nr O (1)Usunąć
For i = 0 to n
, znajdźi
gdzieHashArray(i) = Key.GetHash
# O (log n) (posortowana tablica)HashArray(i)
# O (n) (posortowana tablica)KeyArray(i)
# O (1)ItemArray(i)
# O (1)Zdobądź przedmiot
For i = 0 to n
, znajdźi
gdzieHashArray(i) = Key.GetHash
# O (log n) (posortowana tablica)ItemArray(i)
Loop Through
For i = 0 to n
, powrótItemArray(i)
SortedDictionary
Pamięć
KeyArray(n) = non-sorted array<pointer>
ItemArray(n) = non-sorted array<pointer>
OrderArray(n) = sorted array<pointer>
Dodaj
KeyArray(n) = PointerToKey
nr O (1)ItemArray(n) = PointerToItem
nr O (1)For i = 0 to n
, znajdźi
gdzieKeyArray(i-1) < Key < KeyArray(i)
(używającICompare
) # O (n)OrderArray(i) = n
# O (n) (posortowana tablica)Usunąć
For i = 0 to n
znajdź,i
gdzieKeyArray(i).GetHash = Key.GetHash
# O (n)KeyArray(SortArray(i))
# O (n)ItemArray(SortArray(i))
# O (n)OrderArray(i)
# O (n) (posortowana tablica)Zdobądź przedmiot
For i = 0 to n
znajdź,i
gdzieKeyArray(i).GetHash = Key.GetHash
# O (n)ItemArray(i)
Loop Through
For i = 0 to n
, powrótItemArray(OrderArray(i))
SortedList
Pamięć
KeyArray(n) = sorted array<pointer>
ItemArray(n) = sorted array<pointer>
Dodaj
For i = 0 to n
, znajdźi
gdzieKeyArray(i-1) < Key < KeyArray(i)
(używającICompare
) # O (log n)KeyArray(i) = PointerToKey
# O (n)ItemArray(i) = PointerToItem
# O (n)Usunąć
For i = 0 to n
znajdź,i
gdzieKeyArray(i).GetHash = Key.GetHash
# O (log n)KeyArray(i)
# O (n)ItemArray(i)
# O (n)Zdobądź przedmiot
For i = 0 to n
znajdź,i
gdzieKeyArray(i).GetHash = Key.GetHash
# O (log n)ItemArray(i)
Loop Through
For i = 0 to n
, powrótItemArray(i)
źródło
Gdy chcesz, aby kolekcja była sortowana według klucza podczas iteracji po niej. Jeśli nie potrzebujesz sortowania danych, lepiej będzie, jeśli masz tylko słownik, będzie miał lepszą wydajność.
SortedList i SortedDictionary robią w zasadzie to samo, ale są zaimplementowane w inny sposób, dlatego mają różne mocne i słabe strony wyjaśnione tutaj .
źródło
Próbując przypisać ocenę wydajności do każdego przypadku przedstawionego przez @Lev, użyłem następujących wartości:
Wyniki są (wyższe = lepsze):
Dictionary: 12.0 SortedDictionary: 9.0 SortedList: 6.5
Oczywiście każdy przypadek użycia nada większą wagę pewnym operacjom.
źródło