As the question says, I'm looking for the c# equivalent of the LinkedHashMap in Java.
I need to be able to retrieve keys and values by index, get the size. I need the elements to be ordered in the way they are inserted. One key should be matched to exactly one value.
Collections I've tried (And problems with them):
NameValueCollection - Allows one-many linking. I'm guessing this causes an unnecessary overhead.
OrderedDictionary - Unable to retrieve key by index.
EDIT : It has been pointed out that no such equivalent exists in C#. In the linked question, the answer points to a forum for an example implementation, which appears to be down. Could someone perhaps provide an example implementation here?
EDIT 2 : A CookieCollection from System.Net appears to be what I need. How would this react to larger sizes (number of elements)?
I wrote this one, worked well enough for me in the past. Let me know if you find a mistake.
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());
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With