【问题标题】:Building a sorted dictionary using ToDictionary使用 ToDictionary 构建排序字典
【发布时间】:2013-09-06 02:54:46
【问题描述】:

我不是 C# 和 LINQ 方面的专家。

我有一个Dictionary,我理解为一个哈希表,也就是key不排序。

dataBase = new Dictionary<string, Record>()

Record 是一个用户定义的类,它保存给定键字符串的许多数据。

我发现了一个有趣的例子,它通过 LINQ 将这个 Dictionary 转换为 sorted 字典:

var sortedDict = (from entry in dataBase orderby entry.Key ascending select entry)
.ToDictionary(pair => pair.Key, pair => pair.Value);

此代码可以正常工作。生成的sortedDict 按键排序。

问题:我发现sortedDict还是一个哈希表,一个类型:

System.Collections.Generic.Dictionary<string, Record>

我预计生成的字典应该是一种map,就像在 C++ STL 中一样,它通常实现为(平衡)二叉树以保持键的顺序。但是,生成的字典仍然是一个哈希表。

sortedDict如何维护订单?哈希表不能保存键的顺序。 C#的Generic.Dictionary的实现不是典型的哈希表吗?

【问题讨论】:

  • 通过使用ToDictionary(),您请求并获得了Dictionary。如果要维护排序的 Diecionary,请使用 SortedDictionary
  • 我知道。但是,我在最后一刻需要一个排序的字典。我的问题是Dictionary 如何保持排序,这对我来说很奇怪。 LINQ 代码实际上构建了一个 sorted 字典,而类型仍然是字典。
  • linq 只是对Dictionary 进行排序,它不会创建SortedDictionary

标签: c# dictionary hashtable


【解决方案1】:

Dictionary 维护两个数据结构:一个按插入顺序保存以进行枚举的平面数组,以及用于按键检索的哈希表。

如果在有序集合上使用ToDictionary(),枚举时会有序,但不会保持有序。枚举时,所有新插入的项目都会被添加到后面。

编辑:如果您想依赖这种行为,我建议您查看 MSDN 文档,看看这是有保证的,还是只是偶然的。

【讨论】:

    【解决方案2】:

    SortedDictionary 在构造函数中采用现有的Dictionary,因此创建SortedDictionary 非常容易。

    但如果你愿意,你可以将其作为扩展方法,然后你可以使用dataBase.ToSortedDictionary()

    public static SortedDictionary<K, V> ToSortedDictionary<K,V>(this Dictionary<K, V> existing)
    {
        return new SortedDictionary<K, V>(existing);
    }
    

    【讨论】:

      【解决方案3】:

      linq 代码看起来构建了一个排序字典,但排序是由 linq 完成的,而不是字典本身,而 SortedDictionary 应该自己维护排序。

      要获得排序字典,请使用new SortedDictionary&lt;string, Record&gt;(yourNormalDictionary);

      如果你想让它更容易访问,那么你可以为 ienumerable 写一个扩展:

      public static class Extensions
      {
          public static SortedDictionary<T1, T2> ToSortedDictionary<T1, T2>(this IEnumerable<T2> source, Func<T2, T1> keySelector)
          {
              return new SortedDictionary<T1, T2>(source.ToDictionary(keySelector));
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-06
        • 1970-01-01
        • 2015-12-05
        • 2021-08-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多