Ich finde das SortedList<TKey, TValue>
SortedDictionary<TKey, TValue>
und Dictionary<TKey, TValue>
implementiere die gleichen Schnittstellen.
- Wann sollten wir uns für
SortedList
undSortedDictionary
über entscheidenDictionary
? - Was ist der Unterschied zwischen
SortedList
undSortedDictionary
in Bezug auf die Anwendung?
Antworten:
Wenn Sie über die Elemente in einem der beiden Elemente iterieren, werden die Elemente sortiert. Nicht so bei
Dictionary<T,V>
.MSDN behebt den Unterschied zwischen
SortedList<T,V>
undSortedDictionary<T,V>
:quelle
SortedList
Sie nach Index abrufen können (im Gegensatz zum Abrufen nach Schlüssel) undSortedDictionary
nicht.Ich würde den Unterschied zwischen Wörterbüchern erwähnen.
Das obige Bild zeigt, dass dies
Dictionary<K,V>
in jedem Fall gleich oder schneller ist alsSorted
analog, aber wenn die Reihenfolge der Elemente erforderlich ist, z. B. um sie zu drucken,Sorted
eines ausgewählt.Src: http://people.cs.aau.dk/~normark/oop-csharp/html/notes/collections-note-time-complexity-dictionaries.html
quelle
Immutable
Versionen dieser Wörterbücher wählen , dieSorted
Versionen häufig tatsächlich um etwa 40-50% schneller sind als die nicht sortierten Gegenstücke (immer nochO(log(n))
, aber merklich schneller pro Operation). . Die Timings können jedoch je nach Sortierung der Eingabe unterschiedlich sein. Siehe stackoverflow.com/a/30638592/111575Um die Ergebnisse eines Leistungstests - SortedList vs. SortedDictionary vs. Dictionary vs. Hashtable - zusammenzufassen , die Ergebnisse für verschiedene Szenarien vom Besten zum Schlechtesten:
Speichernutzung:
Einfügungen:
Suchvorgänge:
für jede Schleifenoperation
quelle
Collection
brauchen, könnensorted
Sie vergessenHashtable
undDictionary
: Wenn Sie Ihre Sammlung auf einmal füllen -> wählen Sie SortedList, aber wenn Sie damit rechnen, dass Sie häufig.Add
und.Remove
Elemente benötigen -> wählen Sie SortedDictionary.sorted
bedeutet: Wenn Sie aFor Each MyItem in Collection
ausführen, anstatt in der Reihenfolge verarbeitet zu werden, in der Sie.Add
die Elemente ursprünglich bearbeitet haben ,sorted
Collection
werden sie in einer Reihenfolge verarbeitet, die den Kriterien für dieKey
Werte entspricht (definiert in aIComparer
). Wenn Ihre Schlüssel beispielsweise Zeichenfolgen sind, wird Ihre Sammlung standardmäßig in der alphabetischen Reihenfolge Ihrer Schlüssel verarbeitet. Sie können jedoch jederzeit eine benutzerdefinierte Sortierregel definieren.Wenn Sie möchten, dass die Sammlung nach Schlüssel sortiert wird, wenn Sie darüber iterieren. Wenn Sie Ihre Daten nicht sortieren müssen, sind Sie mit nur einem Wörterbuch besser dran, da es eine bessere Leistung bietet.
SortedList und SortedDictionary machen so ziemlich dasselbe, sind jedoch unterschiedlich implementiert und haben daher unterschiedliche Stärken und Schwächen , die hier erläutert werden .
quelle
Ich kann sehen, dass sich die vorgeschlagenen Antworten auf die Leistung konzentrieren. Der folgende Artikel enthält keine neuen Informationen zur Leistung, erläutert jedoch die zugrunde liegenden Mechanismen. Beachten Sie auch, dass es sich nicht auf die drei
Collection
in der Frage genannten Typen konzentriert, sondern alle Typen desSystem.Collections.Generic
Namespace anspricht .http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class.aspx
Auszüge:
Wörterbuch <>
SortedDictionary <>
SortedList <>
Vorläufige Zusammenfassung der zugrunde liegenden Verfahren
Feedback ist sehr willkommen, da ich sicher nicht alles richtig gemacht habe.
n
.Wörterbuch
Erinnerung
KeyArray(n) -> non-sorted array<pointer>
ItemArray(n) -> non-sorted array<pointer>
HashArray(n) -> sorted array<hashvalue>
Hinzufügen
HashArray(n) = Key.GetHash
# O (1)KeyArray(n) = PointerToKey
# O (1)ItemArray(n) = PointerToItem
# O (1)Entfernen
For i = 0 to n
, findei
woHashArray(i) = Key.GetHash
# O (log n) (sortiertes Array)HashArray(i)
# O (n) (sortiertes Array)KeyArray(i)
# O (1)ItemArray(i)
# O (1)Gegenstand erhalten
For i = 0 to n
, findei
woHashArray(i) = Key.GetHash
# O (log n) (sortiertes Array)ItemArray(i)
Durchschleifen
For i = 0 to n
, RückkehrItemArray(i)
SortedDictionary
Erinnerung
KeyArray(n) = non-sorted array<pointer>
ItemArray(n) = non-sorted array<pointer>
OrderArray(n) = sorted array<pointer>
Hinzufügen
KeyArray(n) = PointerToKey
# O (1)ItemArray(n) = PointerToItem
# O (1)For i = 0 to n
, findei
woKeyArray(i-1) < Key < KeyArray(i)
(mitICompare
) # O (n)OrderArray(i) = n
# O (n) (sortiertes Array)Entfernen
For i = 0 to n
, findei
woKeyArray(i).GetHash = Key.GetHash
# O (n)KeyArray(SortArray(i))
# O (n)ItemArray(SortArray(i))
# O (n)OrderArray(i)
# O (n) (sortiertes Array)Gegenstand erhalten
For i = 0 to n
, findei
woKeyArray(i).GetHash = Key.GetHash
# O (n)ItemArray(i)
Durchschleifen
For i = 0 to n
, RückkehrItemArray(OrderArray(i))
SortedList
Erinnerung
KeyArray(n) = sorted array<pointer>
ItemArray(n) = sorted array<pointer>
Hinzufügen
For i = 0 to n
, findei
woKeyArray(i-1) < Key < KeyArray(i)
(mitICompare
) # O (log n)KeyArray(i) = PointerToKey
# O (n)ItemArray(i) = PointerToItem
# O (n)Entfernen
For i = 0 to n
, findei
woKeyArray(i).GetHash = Key.GetHash
# O (log n)KeyArray(i)
# O (n)ItemArray(i)
# O (n)Gegenstand erhalten
For i = 0 to n
, findei
woKeyArray(i).GetHash = Key.GetHash
# O (log n)ItemArray(i)
Durchschleifen
For i = 0 to n
, RückkehrItemArray(i)
quelle
Beim Versuch, jedem von @Lev präsentierten Fall eine Leistungsbewertung zuzuweisen, habe ich die folgenden Werte verwendet:
Die Ergebnisse sind (höher = besser):
Natürlich wird jeder Anwendungsfall bestimmten Vorgängen mehr Gewicht verleihen.
quelle