22

可能重复:
允许重复键的 C# 可排序集合

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

  Dictionary<key, List<value>>

但它仍然有一些开销。我希望字典有“AllowDuplicates”。

4

7 回答 7

14

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

于 2009-02-16T00:24:04.850 回答
7

.NET 2.0:PowerCollections包含OrderedMultiDictionary.

于 2009-02-16T00:23:50.517 回答
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());
于 2011-10-14T15:00:16.453 回答
3

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

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

于 2009-02-16T00:21:19.460 回答
2

那是行不通的。一旦你从比较器返回 0,它就会抛出“重复”异常。

您不需要类封装或任何东西,只需制作一个不返回 0(相等)结果的比较器。int这是密钥类型的示例

class MyComparer : IComparer<int>
{

  public int Compare(int x, int y)
  {
    if (x < y)
      return -1;
    else return 1;
  }
}
于 2011-10-28T13:04:26.310 回答
0

根据定义,字典包含唯一键。您上面的示例实际上是一种二维键控数组,这是我多次使用过的结构。为什么要拥有重复的密钥?如果你这样做了,词典将如何唯一地称呼它的成员?

于 2009-02-16T00:22:00.973 回答
0

我遇到了同样的问题..我需要一个可以允许重复键的 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>>>();

于 2010-11-22T16:41:49.953 回答