11

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

我有一个Dictionary,我理解的是一个哈希表,也就是说,键没有排序。

dataBase = new Dictionary<string, Record>()

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

我发现了一个有趣的例子,它通过 LINQ 将其转换Dictionary排序字典:

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不是典型的哈希表吗?

4

3 回答 3

10

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

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

public static SortedDictionary<K, V> ToSortedDictionary<K,V>(this Dictionary<K, V> existing)
{
    return new SortedDictionary<K, V>(existing);
}
于 2013-09-03T01:22:25.003 回答
10

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

如果ToDictionary()在有序集合上使用,枚举时会按顺序排列,但不会保持按顺序排列。枚举时,任何新插入的项目都将添加到后面。

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

于 2013-09-03T01:23:35.547 回答
4

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

要获得排序字典,请使用new SortedDictionary<string, Record>(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));
    }
}
于 2013-09-03T01:28:31.713 回答