Holen Sie sich das letzte Element in einem Wörterbuch?

Holen Sie sich das letzte Element in einem Wörterbuch?

Was meinst du mit zuletzt? Meinst du Letzte Wertschöpfung?

Der Dictionary<TKey,TValue> Klasse ist eine ungeordnete Sammlung. Das Hinzufügen und Entfernen von Elementen kann das erste und letzte Element ändern. Daher gibt es keine Möglichkeit, das letzte Element hinzuzufügen.

Es gibt eine geordnete Wörterbuchklasse in Form von SortedDictionary<TKey,TValue> . Dies wird jedoch basierend auf dem Vergleich der Schlüssel und nicht der Reihenfolge, in der Werte hinzugefügt wurden, geordnet.

BEARBEITEN

Mehrere Personen haben die Verwendung des folgenden Ansatzes im LINQ-Stil erwähnt

var last = dictionary.Values.Last();

Seien Sie sehr vorsichtig mit dieser Methode. Es gibt den letzten Wert in der Values-Sammlung zurück. Dies kann der letzte Wert sein, den Sie dem Wörterbuch hinzugefügt haben, muss es aber nicht. Es ist wahrscheinlich genauso wahrscheinlich, dass es nicht ist, wie es sein wird.


Wörterbücher sind ungeordnete Sammlungen – als solche gibt es kein Konzept eines ersten oder letzten Elements. Wenn Sie nach einer Klasse suchen, die sich wie ein Wörterbuch verhält, aber die Einfügereihenfolge der Elemente beibehält, sollten Sie die Verwendung von OrderedDictionary in Betracht ziehen .

Wenn Sie nach einer Sammlung suchen, die die Elemente sortiert, sollten Sie die Verwendung von SortedDictionary<TKey,TValue> in Betracht ziehen .

Wenn Sie ein vorhandenes Wörterbuch haben und nach dem „letzten“ Element in einer bestimmten Sortierreihenfolge suchen, können Sie linq verwenden, um die Sammlung zu sortieren, etwa so:

myDictionary.Values.OrderBy( x => x.Key ).Last();

Indem Sie Dictionary.Keys.Last() vorsichtig verwenden - während die Schlüsselliste nach dem Standard IComparer sortiert wird Für den Typ des Schlüssels ist der erhaltene Wert möglicherweise nicht der erwartete Wert.


Ich weiß, dass diese Frage zu alt ist, um positive Stimmen zu erhalten, aber mir hat keine der Antworten gefallen, also werde ich meine eigene posten, in der Hoffnung, zukünftigen Lesern eine weitere Option anzubieten.

Angenommen, Sie möchten den höchsten Schlüsselwert in einem Wörterbuch, nicht das zuletzt eingefügte:

Die folgenden nicht Arbeit für mich auf .NET 4.0:

myDictionary.Values.OrderBy( x => x.Key ).Last();

Ich vermute, das Problem ist, dass das 'x' einen Wert im Wörterbuch darstellt und ein Wert keinen Schlüssel hat (das Wörterbuch speichert den Schlüssel, die Wörterbuchwerte nicht). Möglicherweise mache ich auch einen Fehler bei der Anwendung der Technik.

In beiden Fällen wäre diese Lösung für große Wörterbücher langsam, wahrscheinlich O(n log n) für CS-Leute, weil es das gesamte Wörterbuch sortiert nur um einen Eintrag zu bekommen. Das ist so, als würden Sie Ihre gesamte DVD-Sammlung neu anordnen, nur um einen bestimmten Film zu finden.

var lastDicVal = dic.Values.Last();

ist als schlechte Idee etabliert. In der Praxis kann diese Lösung den letzten Wert zurückgeben, der dem Wörterbuch hinzugefügt wurde (nicht den höchsten Schlüsselwert), aber in Bezug auf die Softwaretechnik ist dies bedeutungslos und sollte nicht verlässlich sein. Auch wenn es jedes Mal für den Rest der Ewigkeit funktioniert, stellt es eine Zeitbombe in Ihrem Code dar, die von den Details der Bibliotheksimplementierung abhängt.

Meine Lösung ist wie folgt:

var lastValue = dic[dic.Keys.Max()];

Die Funktion Keys.max() ist viel schneller als das Sortieren von O(n) statt O(n log n) .Wenn Leistung wichtig genug ist, sogar O(n) zu langsam ist, kann der zuletzt eingefügte Schlüssel in einer separaten Variable verfolgt werden, die verwendet wird, um dic.Keys.Max() zu ersetzen , was die gesamte Suche so schnell wie möglich macht, oder O(1).

Hinweis:Die Verwendung von Double oder Float als Schlüssel ist nicht die beste Vorgehensweise und kann zu überraschenden Ergebnissen führen, die den Rahmen dieses Beitrags sprengen würden. Lesen Sie mehr über "Epsilon" im Zusammenhang mit Float/Double-Werten.