2009-01-28 12 views
14

Ich frage mich, ob es ein Gegenstück zu java.util.LinkedHashMap in .NET gibt? (dh die Elemente werden automatisch neu geordnet, wenn ich auf ein Element zugreife. (boolean accessOrder)).LinkedHashMap in .NET

+0

Ich mag würde die Logik verstehen, wobei lediglich ein Element in der Sammlung Zugriff als Modifikation gilt, wodurch Nachbestellung verursacht . – Cerebrus

+0

Ich bin nicht vertraut mit der betreffenden Klasse, aber vielleicht einen schnelleren Zugriff auf die am meisten zugegriffen Elemente zu ermöglichen? –

+1

Sie können Details über LinkedHashMap unter http://java.sun.com/javase/6/docs/api/java/util/LinkedHashMap.html sehen. Es erklärt die Verwendung und wann es nützlich ist (LRU-Caches). –

Antwort

5

Ein bisschen Googeln scheint zu zeigen, dass es für LinkedHashMap kein eingebautes C# -Äquivalent gibt, aber es gibt einige Optionen von Drittanbietern.

+1

Ihr Link ist kaputt. – user

9

Nur um ein bisschen für die Leser zu verdeutlichen: LinkedHashMap verhält sich nur so, wenn mit einer bestimmten Konstruktorüberladung gebaut wird. Normalerweise werden die Elemente in Einfügereihenfolge verwaltet. (Das fühlt sich ein bisschen seltsam an, aber macht nichts.)

Ich glaube nicht, dass es solche Klassen in .NET gibt. Es wäre nicht schwer, einen zu erstellen, indem Sie eine verkettete Liste von Elementen und ein Wörterbuch vom Schlüssel zum verknüpften Listenknoten verwenden. Der Zugriff würde dann darin bestehen, den Knoten der verknüpften Liste zu holen, ihn zum Kopf zu bewegen und den Wert zurückzugeben.

Ich wäre glücklich, es heute Abend oder morgen zu implementieren, wenn Sie wollen - (! Fully Testen einer Sammlung ein zeitaufwendiges Geschäft ist), obwohl wahrscheinlich nicht mit voller Unit-Tests usw.

+1

Was ist so eine ungerade Klasse (die sich je nach ctor unterschiedlich verhält) sinnvoll? – configurator

+1

@configurator: Eine typische Optimierung für Hash-Tabellen: Verschieben Sie das Element, auf das zuletzt zugegriffen wurde, an den Anfang seiner Kette; Je häufiger auf ein Element zugegriffen wird, desto schneller wird es gefunden. Wenn Sie sich je nach ctor anders verhalten, denken Sie daran, einen anderen IComparer an eine SortedList zu übergeben. –

+1

@Vojislav: Dies ist keine "typische Optimierung". LinkedHashMap verschiebt Einträge nicht in Buckets, sondern erinnert sich daran, wann die einzelnen Einträge verwendet wurden, und verschiebt den Eintrag an den Anfang der Liste "Zuletzt verwendete Einträge". Dies betrifft nur die Iterationsreihenfolge, nicht die Suchgeschwindigkeit der nächsten Suchvorgänge. –

2

Hier ist eine C# -Implementierung I gefunden auf einem forum:

Es ist undokumentiert, aber hat einige Tests. Es ist jedoch nicht generisch. Zumindest ist es etwas, denke ich.

@Jon: Ich würde es auch schätzen, wenn Sie eine schnelle Implementierung machen könnten. Ich stellte mir vor, dass ein Dictionary oben auf einer LinkedList am besten wäre, aber I hear gibt es Garbage Collection-Probleme mit LinkedList, die Dinge verlangsamt.

+0

Garbage Collection-Problem kann mit Knotenpool gelöst werden. Sie würden jedoch eine benutzerdefinierte doppelt verknüpfte Listenimplementierung benötigen. –

1

Ich habe System.Collections.Specialized.OrderedDictionary als Ersatz für LinkedHashMap verwendet. Es hat für mich funktioniert. Gibt es irgendetwas, was ich an OrderedDictionary vermisse (ja, es ist nicht generisch, aber es ist mit .Net 2 oder neuer verfügbar)?

+1

Es scheint mir, dass OrderedDictionary unterscheidet sich von LinkedHashMap in zwei wichtigen Punkten. 1) Der LinkedHashMap-Eintrag wird nach dem Lesen nach vorne verschoben. Das heißt, die Reihenfolge wird sowohl durch Einfügen als auch durch Auswahl (Zugriff) bestimmt. 2) LinkedHashMap hat eine Überladungsmethode removeEldestEntry. Beide Funktionen sind nützlich, wenn Sie einen Cache erstellen möchten. –

0

Nhibernate verfügt über eine NHibernate.Util.LinkedHashMap-Implementierung.

Wenn Sie bereits auf den Code, wie ich hatte, kann es nützlich sein,

Verwandte Themen