是否有一个替代Dictionary / SortedList允许重复?

时间:2009-02-16 00:18:21

标签: .net dictionary priority-queue multimap

  

可能重复:
  C# Sortable collection which allows duplicate keys

基本上我想使用重复键使Dictionary工作,而不需要进入自定义比较器实现。有一个想法:

  Dictionary<key, List<value>>

但仍有一些开销。我希望词典有“AllowDuplicates”。

7 个答案:

答案 0 :(得分:13)

如果你使用的是.NET 3.5,那么Lookup可能就是你所追求的。

答案 1 :(得分:7)

.NET 2.0:PowerCollections包含OrderedMultiDictionary

答案 2 :(得分:4)

您仍然可以使用SortedList并尝试通过将您的值和Guid组合到一个类中来创建一个唯一键。在这种情况下,您必须为新密钥实施IComparer<NewKey>,例如:

class MyKey
{
    public Guid Guid { get; set; }
    public float Value { get; set; }
}

class MyComparer : IComparer<MyKey>
{

    public int Compare(MyKey x, MyKey y)
    {
        if (x == null || y == null)
            throw new InvalidOperationException("both of parameters must be not null");
        if (x.Value < y.Value) return -1;
        if (x.Value > y.Value) return 1;
        return 0;
    }
}

然后

var mySortedList = new SortedList<MyKey, MyValue>(new MyComparer());

答案 3 :(得分:3)

不在Fx&lt; 3.5 ..显然,您可以使用IList对象的Dictionary来实现一个。但是你有封装问题/责任。

如果您使用的是.NET 3.5,请使用Lookup类。

答案 4 :(得分:3)

这不起作用。一旦从比较器返回0,它将抛出“重复”异常。

您不需要类封装或任何东西,只需使比较器不返回0(相等)结果。以下是int类型键

的示例
class MyComparer : IComparer<int>
{

  public int Compare(int x, int y)
  {
    if (x < y)
      return -1;
    else return 1;
  }
}

答案 5 :(得分:1)

我遇到了同样的问题..我需要一个sortedList,它可以允许重复密钥..

var sortList = new SortedList<string, IDictionary<string, object>>();

但这没有用..所以我用了

var list = new List<KeyValuePair<string, IDictionary<string, object>>>();

将新数据添加为..

list.Add(new KeyValuePair<string, IDictionary<string, object>>>(value, Dictionary));

使用linq我对它进行了排序没有问题..

尝试List<KeyValuePair<TKey, List<TValue>>>();

答案 6 :(得分:0)

根据定义,Dictionary包含唯一键。上面的例子实际上是一种二维键控数组,这是我多次使用过的结构。你为什么要重复密钥?如果你这样做,那么Dictionary会如何唯一地解决其成员?