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

本文关键字:顺序 是什么 Values ToArray Dictionary | 更新日期: 2023-09-27 17:58:03

如果我要向字典中添加值,然后在稍后的代码中,我想使用将该字典转换为数组

myDictionary.Values.ToArray()

数组会按照我输入的顺序出现吗?还是在某个阶段被分类?

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

如果要对值进行排序(在Key上),则应使用SortedDictionary<K,V>SortedList<K,V>

对于普通的Dictionary,Values的顺序取决于实现,但您也可以假设它是随机的。

进入的顺序丢失。

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

Dictionary的MSDN条目对此非常明确:

出于列举的目的,每个项目在字典中被视为KeyValuePair结构表示一个值及其键。这个退货的顺序未定义。

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

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

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

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

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

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

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