2015-03-23 19 views
5

Wie die Frage sagt, bin ich auf der Suche nach der C# Entsprechung der LinkedHashMap in Java.C# Äquivalent von LinkedHashMap

Ich muss Schlüssel und Werte per Index abrufen können, erhalten Sie die Größe. Ich brauche die Elemente in der Reihenfolge, in der sie eingefügt werden. Ein Schlüssel sollte genau einem Wert entsprechen.

Sammlungen Ich habe versucht (und Probleme mit ihnen):
Namevaluecollection - Ermöglicht einmehrdeutige Verknüpfung. Ich schätze, das verursacht unnötigen Overhead.
OrderedDictionary - Schlüssel konnte nicht per Index abgerufen werden.

BEARBEITEN: Es wurde darauf hingewiesen, dass ein solches Äquivalent in C# nicht existiert. In der verknüpften Frage verweist die Antwort auf ein Forum für eine Beispielimplementierung, die anscheinend nicht verfügbar ist. Könnte jemand hier vielleicht eine Beispielimplementierung bereitstellen?

EDIT 2: A Cookie von System.Net scheint zu sein, was ich brauche. Wie würde dies auf größere Größen (Anzahl der Elemente) reagieren?

+0

Nein. Das OP fragt nach einer bestimmten Eigenschaft von LinkedHashMaps, wenn er fragt "die Elemente werden automatisch (neu) geordnet". Jok Skeet fährt fort zu erwähnen, dass diese Funktion nur in einem bestimmten Konstruktor verfügbar ist. Auf der anderen Seite wünsche ich ein gesundes Äquivalent davon. – Hele

+0

Lesen Sie asnwers carfeully: Ihre Frage: "Ich bin auf der Suche nach dem C# Äquivalent der LinkedHashMap in Java.". Antwort (die im verknüpften Thread gefunden werden kann): "Es gibt kein eingebautes C# -Äquivalent für LinkedHashMap". –

+0

Wenn 'NameValueCollection' gut funktioniert, aber Sie" raten ", dass es" unnötigen Overhead "gibt, dann sind die Chancen, dass Sie den Overhead bemerken würden, schwer gegen Sie gestapelt. – dasblinkenlight

Antwort

2

Ich schrieb dieses, funktionierte gut genug für mich in der Vergangenheit. Lass es mich wissen, wenn du einen Fehler findest.

using System; 
using System.Collections.Generic; 

class LinkedHashMap<T, U> 
{ 
    Dictionary<T, LinkedListNode<Tuple<U, T>>> D = new Dictionary<T, LinkedListNode<Tuple<U, T>>>(); 
    LinkedList<Tuple<U,T>> LL = new LinkedList<Tuple<U, T>>(); 

    public U this[T c] 
    { 
     get 
     { 
      return D[c].Value.Item1; 
     } 

     set 
     { 
      if(D.ContainsKey(c)) 
      { 
       LL.Remove(D[c]); 
      } 

      D[c] = new LinkedListNode<Tuple<U, T>>(Tuple.Create(value, c)); 
      LL.AddLast(D[c]); 
     } 
    } 

    public bool ContainsKey(T k) 
    { 
     return D.ContainsKey(k); 
    } 

    public U PopFirst() 
    { 
     var node = LL.First; 
     LL.Remove(node); 
     D.Remove(node.Value.Item2); 
     return node.Value.Item1; 
    } 

    public int Count 
    { 
     get 
     { 
      return D.Count; 
     } 
    } 
} 

class LinkedHashMapTest 
{ 
    public static void Test() 
    { 
     var lhm = new LinkedHashMap<char, int>(); 

     lhm['a'] = 1; 
     lhm['b'] = 2; 
     lhm['c'] = 3; 


     Console.WriteLine(lhm['a']); 
     Console.WriteLine(lhm['b']); 
     Console.WriteLine(lhm['c']); 

     Console.WriteLine(lhm.PopFirst()); 
     Console.WriteLine(lhm.PopFirst()); 
     Console.WriteLine(lhm.PopFirst()); 
    } 
} 
+0

Wie iterieren Sie über die Elemente in der Wörterbuch/verknüpften Liste? Wie ich es verstehe, ist der Vorteil einer LinkedHashMap, dass es wie ein Dictionary mit einer vorhersagbaren Iterationsreihenfolge ist. Ich nehme an, dass es wichtig wäre, über die Elemente zu iterieren. –

+1

Sie können einfach einen Iterator über LL offen legen ('LinkedList > LL'). – N0thing