使用ToDictionary构建排序字典

我不是C#和LINQ的专家。

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

 dataBase = new Dictionary() 

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 

我期望得到的字典应该是C ++ STL中的一种map ,它通常被实现为(平衡的)二叉树以维持密钥的排序。 但是,生成的字典仍然是哈希表。

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

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

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

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

SortedDictionary在构造函数中使用现有的Dictionary ,因此生成SortedDictionary非常容易。

但是你可以使它成为一个扩展方法,然后你可以使用dataBase.ToSortedDictionary()

 public static SortedDictionary ToSortedDictionary(this Dictionary existing) { return new SortedDictionary(existing); } 

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

要获取一个已排序的字典,请使用new SortedDictionary(yourNormalDictionary);

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

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