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

时间:2011-05-28 10:34:21

标签: c# dictionary

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

myDictionary.Values.ToArray()

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

3 个答案:

答案 0 :(得分:11)

如果您希望对值进行排序(在密钥上),那么您应该使用SortedDictionary<K,V>SortedList<K,V>

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

输入的顺序丢失。

答案 1 :(得分:9)

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

MSDN entry for Dictionary对此非常明确:

  

为了枚举,每个项目   在字典中被视为一个   KeyValuePair结构   代表一个值及其关键。该   退货的订单   未定义。

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

[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);
}

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

我不想要想象随着时间的推移多次插入和删除会发生什么。如果你依赖这种无证件的行为,我认为你将欠世界相当于US national debt in bad code offsets

答案 2 :(得分:1)

如果myDictionary的类型为Dictionary<K,V>,则顺序与Keys使用的顺序相同,否则为未定义。特别是它不能保证是插入顺序,或任何有用的顺序,或者甚至在同一应用程序的不同运行中它是相同的顺序。

  

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

http://msdn.microsoft.com/en-us/library/ekcfxy3x.aspx