C#等价于LinkedHashMap

时间:2015-03-23 08:31:59

标签: java c# collections

正如问题所说,我正在寻找Java中 LinkedHashMap 的c#等价物。

我需要能够通过索引检索键值,获取大小。我需要按插入方式排序元素。一个键应该与一个值匹配。

我试过的收藏品(以及它们的问题):
NameValueCollection - 允许一对多链接。我猜这会导致不必要的开销 OrderedDictionary - 无法按索引检索密钥。

编辑:有人指出C#中不存在这样的等价物。在链接的问题中,答案指向一个示例实现的论坛,该论坛似乎已关闭。有人可能会在这里提供一个示例实现吗?

编辑2 :来自System.Net的 CookieCollection 似乎是我需要的。这对较大尺寸(元素数量)有何影响?

1 个答案:

答案 0 :(得分:2)

我写了这篇文章,过去对我来说运作得很好。如果你发现错误,请告诉我。

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());
    }
}