【问题标题】:Is there an alternative to Dictionary/SortedList that allows duplicates? [duplicate]是否有允许重复的 Dictionary/SortedList 的替代方法? [复制]
【发布时间】:2010-10-07 19:18:23
【问题描述】:

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

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

  Dictionary<key, List<value>>

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

【问题讨论】:

标签: .net dictionary priority-queue multimap


【解决方案1】:

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

【讨论】:

  • 很遗憾,这样一个可能有用的类有一些限制。例如没有公共构造函数或添加/删除项目的能力。
  • @Ray,完全同意。虽然我猜这就是为什么它被称为 Lookup 而不是 MultiDictionary 之类的东西,以暗示它是某种不可变的查找而不是要操作的集合。 OP 对 Dictionary> 的建议会更加灵活。
  • @Ray:最好的构造函数是,我引用 MSDN:“您可以通过在实现 IEnumerable 的对象上调用 ToLookup 来创建 Lookup 的实例。”
【解决方案2】:

.NET 2.0:PowerCollections 包含 OrderedMultiDictionary

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      不在 Fx

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

      【讨论】:

      • 它只是Dictionary的替代品,而不是SortedList的替代品。
      【解决方案5】:

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

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

      class MyComparer : IComparer<int>
      {
      
        public int Compare(int x, int y)
        {
          if (x < y)
            return -1;
          else return 1;
        }
      }
      

      【讨论】:

      • 请记住,这个技巧会破坏索引器。如果您尝试使用索引器获取值,则会收到异常,因为找不到键。
      【解决方案6】:

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

      【讨论】:

      • 不要忘记,与哈希表(或字典)不同,它的键查找成本为 O(N),主要是 O(1)。
      【解决方案7】:

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

      【讨论】:

      • 考虑一个现实世界的字典,列出同一个词的不同含义。具有公共键的多个条目。没有什么矛盾的。成员可以通过返回集合或 Enumerable 的查找来寻址。 C++ 的多重映射已经存在很长时间了。这不是一个不可能的问题。 :)
      猜你喜欢
      • 1970-01-01
      • 2017-09-16
      • 2017-02-16
      • 2015-02-13
      • 2019-01-19
      • 2013-08-22
      • 1970-01-01
      • 2016-03-21
      • 2012-08-18
      相关资源
      最近更新 更多