有没有一个允许重复的替代Dictionary/SortedList的选项?

23

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

基本上,我想让一个字典支持重复的键,而不需要使用自定义比较器实现。有一个想法是:

  Dictionary<key, List<value>>

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


在我的搜索中没有找到。投了关闭票,谢谢。 - Sedat Kapanoglu
相关链接:https://dev59.com/_m025IYBdhLWcg3w7qfL - Mechanical snail
7个回答

14
如果您正在使用.NET 3.5,那么Lookup可能是您想要的。

5
这个潜在非常有用的类有一些限制,例如没有公共构造函数或添加/删除项目的能力,这真是遗憾。 - Ray
2
@Ray,完全同意。虽然我猜这就是为什么它被称为Lookup而不是MultiDictionary之类的东西,以提示它是某种不可变查找而不是要操作的集合。OP提出的Dictionary<key,List<value>>的建议会更加灵活。 - LukeH
@Ray:最好的构造函数是,我引用MSDN的话说:“您可以通过在实现IEnumerable<T>的对象上调用ToLookup来创建Lookup<TKey,TElement>的实例。 - Luis Filipe

7

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

如果不在Fx < 3.5版本中,您可以使用IList对象的Dictionary来实现。但这会带来封装问题和责任。

如果您使用的是.NET 3.5,则可以使用Lookup类。


它只是Dictionary的替代品,而不是SortedList的替代品。 - Roman Starkov

2

这样做是不行的。一旦从比较器中返回0,它就会抛出“重复”异常。

你不需要类封装或其他任何东西,只需创建一个不返回0(相等)结果的比较器。这里是一个针对int类型键的示例。

class MyComparer : IComparer<int>
{

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

5
记住这个技巧会破坏索引器。如果你试图使用索引器获取一个值,你将会收到一个异常,因为找不到该键。 - Erik van Brakel

0

按照定义,字典包含唯一的键。你上面的例子实际上是一种二维键数组,这是我多次使用过的结构。为什么要有重复的键呢?如果有重复的键,字典如何唯一地寻址其成员呢?


6
考虑一个列出同一个单词不同含义的实际词典。有多个条目具有共同的键,这并没有什么矛盾之处。可以通过查找返回集合或可枚举项来访问成员。C++已经拥有多年的multimap。这不是一个不可能的问题。 :) - jalf

0

我遇到了同样的问题。我需要一个可以允许重复键的排序列表。

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


4
不要忘记,与哈希表(或字典)的O(1)大多数查找成本相比,这具有O(N)按键查找成本。 - Sedat Kapanoglu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接