C# Dictionary.Values.ToArray()的顺序是什么?

C# Dictionary.Values.ToArray()的顺序是什么?,c#,dictionary,C#,Dictionary,如果我向字典中添加值,然后在代码的后面某处添加值,我希望使用以下命令将该字典转换为数组: myDictionary.Values.ToArray() 数组会按照我输入的顺序显示吗?或者它是在某个阶段排序的?如果您想对值进行排序(在键上),那么您应该使用SortedDictionary或SortedList 对于普通字典,值的顺序取决于实现,但您也可以假设它是随机的 输入顺序丢失。返回值的顺序很可能(但不能保证)与存储键的顺序相同。正如Henk Holterman所提到的,这是特定于实现的,不应

如果我向字典中添加值,然后在代码的后面某处添加值,我希望使用以下命令将该字典转换为数组:

myDictionary.Values.ToArray()

数组会按照我输入的顺序显示吗?或者它是在某个阶段排序的?

如果您想对值进行排序(在键上),那么您应该使用
SortedDictionary
SortedList

对于普通字典,值的顺序取决于实现,但您也可以假设它是随机的


输入顺序丢失。

返回值的顺序很可能(但不能保证)与存储键的顺序相同。正如Henk Holterman所提到的,这是特定于实现的,不应依赖

这一点非常明确:

为便于枚举,每个项目 在字典中被视为 键值对结构 表示一个值及其键。这个 返回项目的顺序 没有定义

编辑字典可能会通过按添加顺序返回值来引诱您产生错误的安全感,但下面的通过测试表明,它的行为实际上要微妙得多:

[TestMethod]
public void TestDictionary()
{
    var dictionary1 = new Dictionary<int, int>();
    var dictionary2 = new Dictionary<int, int>();
    for(int i = 0; i < 10; i++){
        dictionary1[i] = i;
        if (i != 3)
            dictionary2[i] = i;
    }

    dictionary1.Remove(3);
    dictionary1[3] = 3;
    dictionary2[3] = 3;

    CollectionAssert.AreEqual(new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, dictionary1.Values);
    CollectionAssert.AreEqual(new[] { 0, 1, 2, 4, 5, 6, 7, 8, 9, 3 }, dictionary2.Values);
}
[TestMethod]
公共void TestDictionary()
{
var Dictionary 1=新字典();
var dictionary2=新字典();
对于(int i=0;i<10;i++){
字典1[i]=i;
如果(i!=3)
字典2[i]=i;
}
字典1.移除(3);
词典1[3]=3;
字典2[3]=3;
集合Assert.AreEqual(新的[]{0,1,2,3,4,5,6,7,8,9},字典1.Values);
集合Assert.AreEqual(新的[]{0,1,2,4,5,6,7,8,9,3},字典2.Values);
}
如果仔细查看代码,您会发现字典中元素的顺序不是添加元素的顺序,而是最初添加元素的顺序


我不想想象随着时间的推移,多次插入和删除会发生什么。如果你依赖这种未记录的行为,我认为你将欠世界一个等价物。

如果
myDictionary
Dictionary
类型,那么顺序与
键所使用的顺序相同,或者没有定义。特别是,它不能保证是插入顺序,或任何有用的顺序,甚至不能保证在同一应用程序的不同运行中是相同的顺序

未指定Dictionary.ValueCollection中值的顺序,但其顺序与keys属性返回的Dictionary.KeyCollection中关联键的顺序相同


什么样的词典?这本很有用。您可以通过
new SortedDictionary(现有词典)将
词典
转换为
SortedDictionary