26 Stimmen

Gibt es einen sortierten Sammlungstyp in .NET?

Ich suche nach einem Container, der alle seine Elemente in Ordnung hält. Ich habe mir SortedList angesehen, aber das erfordert einen separaten Schlüssel und erlaubt keine doppelten Schlüssel. Ich könnte auch einfach einen unsortierten Container verwenden und ihn nach jedem Einfügen explizit sortieren.

Verwendung:

  • Gelegentliches Einfügen
  • Häufiges Durchlaufen in Reihenfolge
  • Am besten ohne mit den eigentlichen Objekten separaten Schlüsseln zu arbeiten und eine Vergleichsfunktion zum Sortieren zu verwenden.
  • Stabiles Sortieren für äquivalente Objekte ist erwünscht, aber nicht erforderlich.
  • Zugriff auf Elemente durch Zufall ist nicht erforderlich.

Ich bin mir bewusst, dass ich mir einfach selbst eine ausbalancierte Baumstruktur erstellen kann, aber ich habe mich gefragt, ob das Framework bereits ein solches Biest enthält.

20voto

JeremiahClark Punkte 5161

Sie sollten sich vielleicht die Wintellect Power Collections ansehen. Sie ist auf CodePlex verfügbar und enthält einige sehr nützliche Sammlungen. Die OrderedBag-Sammlung in dem Projekt ist genau das, wonach Sie suchen. Sie verwendet im Wesentlichen einen Rot-Schwarz-Baum, um eine ziemlich effiziente Sortierung bereitzustellen.

14voto

nawfal Punkte 65966

Nur um EBarr's Kommentar als Antwort zu machen, gibt es seit .NET 4.0 SortedSet. Natürlich ist es eine Menge, was bedeutet, dass Sie keine Duplikate haben können.

4voto

Jason Punkte 2139

Wenn Sie nur mit den Standardkollektionen arbeiten möchten, wird oft die Sort(IComparer<>)-Funktion der List<>-Klasse ignoriert. Alles, was Sie tun müssen, ist einen geeigneten Comparer<> für Ihre Objekte zu erstellen. Zum Beispiel:

public class PositionDateComparer : IComparer
{
    public int Compare(VehiclePosition x, VehiclePosition y)
    {
        if (x.DateTime == DateTime.MinValue)
        {
            if (y.DateTime == DateTime.MinValue)
            {
                // Wenn x null und y null sind, sind sie gleich.
                return 0;
            }

            // Wenn x null und y nicht null ist, ist y größer.
            return -1;
        }

        // Wenn x nicht null ist...
        //
        if (y.DateTime == DateTime.MinValue)
        // ...und y null ist, ist x größer.
        {
            return 1;
        }

        // ...und y nicht null ist, vergleichen Sie die Datumswerte
        //
        if (x.DateTime == y.DateTime)
        {
            // x und y sind gleich
            return 0;
        }

        if (x.DateTime > y.DateTime)
        {
            // x ist größer
            return 1;
        }

        // y ist größer
        return -1;
    }
}

Führen Sie dann einfach vehiclePositionsList.Sort(new PositionDateComparer()) aus, wann immer Sie die Liste vor dem Zugriff sortieren möchten. Mir ist klar, dass dies möglicherweise nicht so einfach ist wie ein Container, der jedes Mal automatisch sortiert, wenn ein neues Objekt hinzugefügt wird, aber für viele (wie mich!) reicht dies möglicherweise aus, um die Aufgabe erfolgreich zu erledigen, ohne zusätzliche Bibliotheken zu benötigen.

3voto

Joe Basirico Punkte 1923

Ich würde Ihre eigene Listenklasse erweitern, die, wie Sie erwähnten, einfach nach jedem Einfügen sortiert. Da Ihre Einfügungen selten sind, wäre der Leistungseinbruch minimal, und das Sortieren einer fast sortierten Liste geht sowieso schnell. Erweitern Sie die generische Liste und überschreiben Sie die Add-Methode, um sofort zu sortieren. Wenn die Leistung zum Problem wird, können Sie an Ort und Stelle einfügen, um etwas Zeit zu sparen. Außerdem können Sie Ihre Einfügungen in einer Warteschlange speichern, um eine einzelne Traversierungseinfügung für alle Werte durchzuführen, die Sie einfügen möchten.

1voto

tobsen Punkte 5278

Wie ich bereits heute hier erwähnt habe, hat die C5 Generic Collection Library den richtigen Container für Sie.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X