字典的Dictionary.Values.ToArray()方法执行顺序是什么?

14
如果我正在向字典中添加值,然后在代码的其他地方,我希望使用以下方法将该字典转换为数组:
myDictionary.Values.ToArray()

这个数组会按照我输入的顺序排列吗?还是在某个阶段进行了排序?


1
什么类型的字典? - CodesInChaos
3个回答

16
如果您想按键(Key)排序值,则应使用SortedDictionary<K,V>SortedList<K,V>
对于普通的字典,值的顺序是与实现有关的,但您也可以假设它是随机的。
输入顺序丢失。

这个可以用以下代码将 Dictionary 转换成 SortedDictionary: new SortedDictionary<k, v>(existingDictionary); - Senura Dissanayake

12
返回结果如下:

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

MSDN词典条目非常明确地指出了这一点:

为了枚举,在字典中的每个项被视为表示值和其键的KeyValuePair结构。返回项目的顺序未定义。

编辑 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);
}

如果你仔细查看代码,你会发现字典中元素的顺序不是添加元素的顺序,而是元素最初添加的顺序。 我甚至不想去想象随着时间的推移多次插入和删除会发生什么。如果你依赖这个未记录的行为,我认为你将要用等价于美国国债的糟糕代码抵消的方式来弥补世界。

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接