C# 使用ToDictionary构建排序字典

C# 使用ToDictionary构建排序字典,c#,dictionary,hashtable,C#,Dictionary,Hashtable,我不是C#and LINQ方面的专家 我有一个字典,我理解它是一个哈希表,也就是说,键没有排序 dataBase = new Dictionary<string, Record>() 此代码工作正常。生成的sortedct按键排序 问题:我发现sortedct仍然是一个哈希表,一种: System.Collections.Generic.Dictionary<string, Record> System.Collections.Generic.Dictionary

我不是C#and LINQ方面的专家

我有一个
字典
,我理解它是一个哈希表,也就是说,键没有排序

dataBase = new Dictionary<string, Record>()
此代码工作正常。生成的
sortedct
按键排序

问题:我发现
sortedct
仍然是一个哈希表,一种:

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

我期望得到的字典应该是C++中的一个<>代码> map > /c>,它通常被实现为一个(平衡的)二叉树来保持密钥的排序。但是,生成的字典仍然是一个哈希表


sortedct
如何维护订单?哈希表不能保存键的顺序。C#的
通用字典
的实现是否不是典型的哈希表?

SortedDictionary
在构造函数中使用现有的
字典
,因此制作
SortedDictionary
非常简单

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

publicstaticsorteddictionary到SortedDictionary(此词典已存在)
{
返回新的SortedDictionary(现有);
}

字典
维护两种数据结构:按插入顺序保存的平面数组用于枚举,哈希表用于按键检索

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


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

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

要获得排序字典,请使用
newsorteddictionary(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));
    }
}
公共静态类扩展
{
公共静态SortedDictionary到SortedDictionary(此IEnumerable源,Func键选择器)
{
返回新的SortedDictionary(source.ToDictionary(keySelector));
}
}

通过使用
ToDictionary()
,您请求并获得了一本
词典。如果要维护已排序的字典,请使用
SortedDictionary
I know。但是,我在最后一刻需要一本分类词典。我的问题是
Dictionary
如何维护排序,这对我来说很奇怪。LINQ代码实际上构建了一个排序字典,而类型仍然是一个字典。LINQ只是对
字典
进行排序,它不创建
排序字典
public static SortedDictionary<K, V> ToSortedDictionary<K,V>(this Dictionary<K, V> existing)
{
    return new SortedDictionary<K, V>(existing);
}
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));
    }
}