2015-03-23 1 views
5

Come la domanda dice, sto cercando l'equivalente C# della LinkedHashMap in Java.equivalente C# di LinkedHashMap

Devo essere in grado di recuperare i tasti e valori per indice, ottenere la dimensione. Ho bisogno che gli elementi siano ordinati nel modo in cui sono inseriti. Una chiave deve corrispondere esattamente a un valore.

Collezioni che ho provato (e problemi con loro):
NameValueCollection - Permette uno-molti di collegamento. Immagino che questo causi un sovraccarico non necessario.
OrderedDictionary - Impossibile recuperare la chiave per indice.

EDIT: È stato rilevato che non esiste un equivalente in C#. Nella domanda collegata, la risposta rimanda a un forum per un'implementazione di esempio, che sembra essere inattivo. Qualcuno potrebbe forse fornire un'implementazione esemplificativa qui?

EDIT 2: A CookieCollection da System.Net sembra essere quello che mi serve. Come reagirebbe a dimensioni maggiori (numero di elementi)?

+0

No. L'OP chiede desidera una caratteristica particolare di LinkedHashMaps quando chiede "gli elementi vengono (ri) ordinati automaticamente". Jok Skeet quindi procede a menzionare che la funzione è disponibile solo in un particolare costruttore. D'altra parte, desidero un sano equivalente di esso. – Hele

+0

Leggi come rispondere carfeully: La tua domanda: "Sto cercando l'equivalente C# di LinkedHashMap in Java.". Risposta (che può essere trovata nella discussione collegata): "non esiste un equivalente in C# per LinkedHashMap". –

+0

Se 'NameValueCollection' funziona bene, ma stai" supponendo "che ci sia un" sovraccarico superfluo ", allora le probabilità che ti accorga che il sovraccarico si accumulano pesantemente contro di te. – dasblinkenlight

risposta

2

Ho scritto questo, ha funzionato abbastanza bene per me in passato. Fammi sapere se trovi un errore.

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

Come si esegue iterare sugli elementi nel dizionario/elenco collegato? A quanto ho capito, il vantaggio di una LinkedHashMap è che è come un dizionario con un ordine di iterazione prevedibile. Quindi presumo che essere in grado di scorrere gli elementi sia importante. –

+1

È possibile esporre un iteratore su LL ('LinkedList > LL'). – N0thing