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

Joe*_*oel 11 c# dictionary

如果我在字典中添加值,然后在代码中添加,我想使用以下命令将该字典转换为数组:

myDictionary.Values.ToArray()
Run Code Online (Sandbox Code Playgroud)

阵列会按照我输入的顺序出现吗?还是在某个阶段排序?

Hen*_*man 13

如果您希望对值进行排序(在Key上),那么您应该使用a SortedDictionary<K,V>或aSortedList<K,V>

对于普通字典,值的顺序依赖于实现,但您可以假设它是随机的.

输入的顺序丢失了.


Igo*_*aka 10

返回值的顺序很可能(但不保证)与存储密钥的顺序相同.正如Henk Holterman所说,这是特定于实现的,不应该依赖它.

字典的MSDN条目非常明确:

出于枚举的目的,字典中的每个项都被视为表示值及其键的KeyValuePair结构.返回项的顺序未定义.

EDIT Dictionary可能会通过看似按照添加顺序返回值来引诱您进入虚假的安全感,但是在通过测试之后,它表明其行为实际上更加微妙:

[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);
}
Run Code Online (Sandbox Code Playgroud)

如果仔细查看代码,您将看到字典中元素的顺序不是添加元素的顺序,而是最初添加元素的顺序.

我不想想想随着时间的推移多次插入和删除会发生什么.如果你依赖这种无证行为,我认为你将欠世界相当于美国国债的不良代码抵消.