Warum hat Microsoft keine generische Implementierung von OrderedDictionary bereitgestellt?
Ich habe einige benutzerdefinierte Implementierungen gesehen, darunter: http://www.codeproject.com/KB/recipes/GenericOrderedDictionary.aspx
Aber warum hat Microsoft es nicht in die .net-Basisbibliothek aufgenommen? Sicher hatten sie einen Grund, kein Generikum zu bauen ... aber was ist das?
Vor dem Posten dieser Nachricht habe ich Folgendes gesehen: https://stackoverflow.com/questions/2629027/no-generic-implementation-of-ordereddictionary
Aber das bestätigt nur, dass es nicht existiert. Nicht, warum es nicht existiert.
Vielen Dank
SortedDictionary<TKey, TValue>
: msdn.microsoft.com/en-us/library/f7fta44c.aspxAntworten:
In C # 4.0 Kurz gesagt, habe ich Folgendes gelesen:
OrderedDictionary
ist eine Kombination aus aHashTable
undArrayList
ArrayList
ArrayList
Klasse wird hauptsächlich für die Abwärtskompatibilität mit Framework 1.x verwendet ..."ArrayList
ist funktional ähnlichList<object>
"ArrayList
als mit einemList<object>
"Fazit?
Keine generische
OrderedDictionary
Klasse, da das zugrunde liegende Konstrukt eine (inoffiziell) veraltete Klasse ist, die selbst keine generische Version hat.quelle
OrderedDictionary
Kovarianz und Kontravarianz?Das
OrderedDictionary
überlädt die Indizierungsoperation, sodass die Indizierung mit einer GanzzahlN
das Element in Position bringtN
, während die Indizierung mit einemObject
das Element abruft, das diesem Objekt entspricht. Wenn Sie einenOrderedDictionary<int, string>
aufgerufenenmyDict
und hinzugefügten Artikel (1, "George") und (0, "Fred") in dieser Reihenfolge erstellen , sollten SiemyDict[0]
"George" oder "Fred" zurückgeben?Ein solches Problem hätte gelöst werden können, indem dem Schlüsseltyp eine Klassenbeschränkung auferlegt wurde. Andererseits beruht ein Großteil des Nutzens von generischen Sammlungen auf ihrer Fähigkeit, effizient mit Werttypen zu arbeiten. Das Auferlegen einer Klassenbeschränkung für den Schlüsseltyp scheint ein wenig hässlich zu sein.
Wenn die Klasse nicht CLS-kompatibel sein musste, sondern nur mit vb.net arbeiten musste, wäre es möglicherweise sinnvoll gewesen, benannte indizierte Eigenschaften zu verwenden. So hätte im obigen Beispiel
myDict.ByKey[0]
"Fred" undmyDict.BySequence[0]
"George" ergeben. Leider unterstützen Sprachen wie C # keine benannten indizierten Eigenschaften. Zwar hätte man auch ohne solche Eigenschaften etwas verwerfen können, um die Verwendung der obigen Syntax zuzulassen, aber die unglückliche Entscheidung, die Felder von Strukturen wiePoint
und zu umschließen,Rectangle
bedeutet, dass fürmyDict.ByKey[0] = "Wally"
die ArbeitmyDict.ByKey
ein neues Klassenobjekt zurückgegeben werden muss. Eine Struktur wäre effizienter, aber Compiler würden einen Schreibzugriff auf eine schreibgeschützte Struktur ablehnen (ungeachtet dessen, dass die Eigenschaft die von zurückgegebene Struktur nicht ändern würdeByKey
ändern Sie stattdessen die Sammlung, auf die sie einen Verweis enthält.Persönlich denke ich, dass ein Dictionary-ish-Objekt, das so spezifiziert wurde, dass es die Reihenfolge der Einfügungen verfolgt, eine nette Sache wäre; Ich hätte auch gerne ein Dictionary-ish-Objekt, das den Schlüssel, der einem bestimmten Schlüssel zugeordnet ist, problemlos zurückgeben könnte (z. B., wenn bei einem Dictionary die Groß- und Kleinschreibung nicht beachtet wird und ein Datensatz mit dem Schlüssel "GEORGE" hinzugefügt wurde) könnte das Wörterbuch fragen, welcher Schlüssel mit "George" verknüpft ist, ohne alle
KeyValuePair
in einer Aufzählung zurückgegebenen Objekte durchsuchen zu müssen .quelle
Da die Aufrechterhaltung der Reihenfolge die von IDictionary implizierte Suche nach O (1) verhindert, sofern Sie nicht zwei Auflistungen (eine für die Reihenfolge und eine für die Suche) umschließen, wodurch die Leistung beim Hinzufügen / Entfernen verringert und die Speichernutzung erhöht wird. Oder Sie können langsamer suchen, wenn Sie weniger Arbeitsspeicher benötigen.
Ich vermute, dass es hier keine "eindeutig bessere" Wahl gab, sodass sie nicht in die Standardbibliothek aufgenommen wurde. Vor allem um 2.0 lernte C # immer noch aus Javas Fehlern. Es würde mich nicht wundern, wenn Javas Ansatz von "Alles und das Küchenspülbecken" für Sammlungen in ihrer Standardbibliothek auch als etwas angesehen würde, das man vermeiden sollte.
quelle
OrderedDictionary
einList
. Ich würde mir vorstellen, dass jeder, der einen legitimen Anwendungsfall für einenOrderedDictionary
hat, ihn speziell verwendet, weil er eine Auflistungsklasse benötigt, die O (1) Lookup hat, sich aber auch an die Einfügereihenfolge erinnert. In diesem Fall ist die Verwendung von zusätzlichem Speicher unvermeidbar und daher akzeptabel.