Warum gibt es keine SortedList<T> in .NET?
Warum gibt es nur ein SortedList<TKey, TValue>
das sieht eher aus wie ein Wörterbuch, aber keine SortedList<T>
das ist eigentlich nur eine Liste, die immer sortiert?
Laut in der MSDN-Dokumentation auf der SortedList, es ist tatsächlich intern umgesetzt als ein dynamisch-size array von KeyValuePair<TKey, TValue>
dass man immer nach dem Schlüssel sortiert. Würde nicht die gleiche Klasse mehr als nützlich, eine Liste von jedem Typ T
? Würde nicht passen, dass der name auch besser?
- hmm, ein interessanter Gedanke. Aber wenn ich eine SortedList<Foo - > wie wäre es Sortiervorgang auszuführen (wheres der "Schlüssel")? Würde ich machen, Foo implementieren IComparable?
- Stimme dir zu - gegeben, der name, den Sie wirklich nicht erwarten würden, dass dieser Klasse enthalten Schlüssel-Wert-Paare. Es ist nicht ein Wörterbuch, natürlich, wie können Sie den gleichen Schlüssel in der Liste mehrere Male.
- ja, man könnte entweder Foo IComparable-oder Sie liefern könnte eine comparer beim erstellen der Liste.
- wie wäre die Sortierung einer normalen Liste anders sein, von der Sortierung der Schlüssel in
SortedList<TKey, TValue>
? - ich könnte falsch sein, aber mit der SortedList Sie liefern den key (TKey), die normalerweise eine native type " (int), die vergleichbar ist standardmäßig aktiviert. Sie sind ausdrücklich zu sagen "das ist der Schlüssel zum Sortieren nach". wenn ich erklären var sortedFoo = new SortedList<Foo - >;, wie funktioniert der compiler wissen, wie ich möchte, es sortiert? Das war meine Frage (die beantwortet wurde durch @WillA)
- Sie scheinen wie downvoting jede einzelne Antwort auf diese Frage. Ich bin froh, dass ich noch nicht eine Antwort. Im, meiner Meinung nach, etwas sein sollte downvoted, wenn es nicht hilfreich ist, und nicht, wenn Sie gingen, um den Aufwand zu liefern, eine Antwort auf die Frage, was aber nicht wirklich eine "richtige Antwort"
- Igitt, hässlich downvote fest. Die OP ' s voting record ist nicht inspirierend.
- zum Glück ist es ziemlich die Ausnahme.
- Tut mir Leid, aber ich downvoted alle Antworten (außer für Dan-Tao), weil ich fand, dass Sie nicht nützlich sind. Die meisten von Ihnen gar nicht die situation zu verstehen (und noch hat Sie zunächst). Ich würde sagen, die Frage hat eine richtige Antwort, aber ich denke, nur jemand aus der .NET base class library team, die es bieten kann.
- Wenn Sie Fragen, die SO Gemeinschaft eine Frage, ich denke, die Implikation ist in der Regel, dass man sagt, "Jemand da draußen kümmern, Ihre Gedanken zu teilen und mir helfen mit diesem?" Wenn Sie Fragen, eine Frage, wo die Antwort nur, dass Sie glücklich sein würde, mit würde müssen kommen gerade vom BCL-team, wie es scheint, die Buchung auf, SO ist das irgendwie sinnlos. Warum nicht einfach senden Sie Ihre Frage für Sie an?
- Eine ähnliche Frage für java, die hat erhielten mehr Aufmerksamkeit. Begründung könnte sein, gleichen. why-there-is-no-sortedlist-in-java
- Für jeden, der wirklich will, um eine sortierte Liste geben, überprüfen Sie heraus
BList<T>
, Teil des AList Familie von Daten-Strukturen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Obwohl niemand kann wirklich sagen, warum es keine
SortedList<T>
ist es möglich, zu diskutieren, warumSortedList
nimmt einen Schlüssel und einen Wert. Ein Wörterbuch maps keys to values. Die typischen Möglichkeiten, dies zu tun sind mit einem binären Baum, hash-Tabelle, und eine Liste (array), obwohl in hash-Tabellen sind am meisten verbreitet, weil Sie in sind O(1) für die meisten Operationen.Den primären operation, die er nicht unterstützt, ist in O(1) ist immer die nächste-Taste um. Wenn Sie wollen in der Lage sein, das zu tun, verwenden Sie in der Regel ein binärer Baum, so dass Sie ein sortiertes Wörterbuch.
Wenn Sie sich entscheiden, die Karte als Liste, würden Sie halten die Elemente sortiert-Taste, so daß lookup ist O(lg n), geben Sie eine andere sortierte Wörterbuch -- in form einer sortierten Liste. Natürlich die Namen
SortedDictionary
bereits getroffen wurde, aberSortedList
war nicht. Ich könnte es nannteSortedListDictionary
oderSortedDictionaryList
, aber ich habe nicht bekommen, es zu benennen.Gibt es jetzt 🙂
SortedList<T>
nicht umsetzen könnenIList<T>
da einige Operationen keine Bedeutung haben im Rahmen einer geordneten Sammlung - wie index setter,InsertAt
undRemoveAt
RemoveAt(int index)
wird die Liste noch sortiert werden.RemoveAt
IList<T>
und eine exception werfen, wennInsertAt()
genannt wird. Zwar nicht ideal, das ist, wie arrays implementierenIList<T>
, und ich denke, dass ist vorzuziehen, um nicht die Umsetzung der Schnittstelle zu allen.Ich glaube, der Grund ist wohl einfach, dass
List<T>
bereitsBinarySearch
undInsert
, was bedeutet, dass die Umsetzung Ihrer eigenen immer sortierte Liste ist trivial.Nicht, dass dies bedeutet, eine
SortedList<T>
Klasse gehört nicht in den Rahmen-nur, dass es wahrscheinlich nicht eine sehr hohe Priorität, da könnte es leicht sein, schnell geschrieben, von jedem Entwickler, der es brauchte.Ich denke, das gilt auch für
HashSet<T>
, die ursprünglich nicht existieren, weil Sie könnte leicht mit einemDictionary<T, byte>
(zum Beispiel) zu simulieren " vor .NET 3.5.Ich weiß, dass das, was ich Tat, in beiden Fällen: ich hatte ein
UniqueSet<T>
Klasse und einAlwaysSortedList<T>
Klasse, die nur mit einemDictionary<T, byte>
und einList<T>
(und verwendetBinarySearch
undInsert
), beziehungsweise.SortedList<T>
war zu gering-Priorität, dann sicherlichSortedList<TKey, TValue>
, die eine strenge Untermenge der Funktionalität, wäre sogar noch niedriger Priorität.SortedList<TKey, TValue>
. Ich meine, im Hinblick auf seine Umsetzung, ja, es scheint der Fall zu sein. Aber diese Klasse ist eindeutig gemeint zu sein als ein Wörterbuch, also alle Vergleiche zwischenSortedList<TKey, TValue>
undSortedDictionary<TKey, TValue>
in der MSDN-Dokumentation (und die Tatsache, dassSortedList<TKey, TValue>
implementiertIDictionary<TKey, TValue>
). Ich weiß nicht, warum Sie haben würde, priorisiert diese über eine "echte" sortierte Liste; die Tatsache bleibt, dass die Umsetzung eines sich selbst nimmt praktisch keine Mühe.Ich denke, der Weg zu gehen mit diesem problem ist die Implementierung einer Erweiterung Methode fügt hinzu, dass
List<T>
in einer geordneten Art und Weise (nur 2 Zeilen code ;), und dannList<T>
können verwendet werden als sortierte Liste (vorausgesetzt, Sie vermeiden Sie die VerwendungList.Add(...)
):Es ist eine Liste mit der Sortierung geschieht durch die-Taste. Ich bin nur spekulieren, aber durch die Möglichkeit, geben Sie den Schlüssel getrennt von dem element, das element muss nicht vergleichbar sein-nur der key sein muss. Ich könnte mir vorstellen, dass im Allgemeinen Fall das spart eine Menge code entwickelt werden, die IComparable implementieren, da die Taste ist eher ein Typ, dass ist schon vergleichbar.
SortedList<TK,TV>
bieten nicht die gewünschte Funktionalität entweder.SortedList<T>
, Sie würde am Ende mit zu implementieren IComparable für eine Klasse und die, die IComparable würde einfach re-implementieren (oder delegieren die Funktionalität) die Vergleichbarkeit ein Wert-Typ. Wenn das der Fall ist, so dass die Sortierschlüssel explizite vereinfacht die Implementierung für den Benutzer der Klasse auf Kosten der einige Speicher-overhead -- unter der Annahme, dass der Schlüssel gezogen von einer class-Eigenschaft. Sie können natürlich eine Liste der sortierten Schlüssel und einer Liste der zugehörigen Werte in der gleichen Reihenfolge. Ich glaube, das ist, wie SortedList umgesetzt wird. Nicht sehr effizient.RPM Kommentare ist ziemlich gültig. Auch mit der Linq-extensions, die Sie tun können, Sortieren Sie nach Eigenschaften von T mit der Sort-Erweiterung-Methode. Ich denke, dass könnte die wichtigsten Gründe dahinter.
Sort
- Erweiterung-Methode. Wenn Sie alsoList<T>.Sort
(das ist weder eine Methode noch ein Teil der LINQ), dann mit diesem nach jedem AufrufAdd
undInsert
wäre viel langsamer als notwendig. Wenn Sie alsoOrderBy
, das ist noch langsamer.Sorted..
Klasse ist, dass er behauptet, die Art, wie Sie hinzufügen/entfernen von Elementen. Das ist etwas ganz anderes als der Aufruf-Liste.Art, Wann immer Sie es brauchen, um sortiert werden; wenn das die einzige Lösung ist, dann in einigen Fällen verwenden Programmierer wäre zu nennen, Sortieren, jedes mal, wenn Sie Hinzugefügt ein neues element: extrem langsam. Gut Sortiert.. Klasse durchführen würde viel besser als das aufrufen von Sort auf jeden Einfügung (über geeignete interne Struktur).