是否保证Dictionary.Values按照添加顺序返回元素?

时间:2012-11-17 13:42:16

标签: c# dictionary

在审核一个应用程序的代码时,我发现它假定Dictionary.Values的顺序与添加到集合中的元素相同。

我已经编写了应用程序来测试这是否正确:

using System;
using System.Collections.Generic;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, int> values = new Dictionary<string, int>();

            values.Add("apple2", 2);
            values.Add("apple3", 3);
            values.Add("apple4", 4);
            values.Add("apple5", 5);
            values.Add("apple6", 6);
            values.Add("apple1", 1);

            var list = new List<int>(values.Values);

            for (int i = 0; i < list.Count; i++)
            {
                Console.WriteLine(list[i]);
            }

        }
    }
}

输出是:

2
3
4
5
6
1

首先,我想知道这是怎么可能的。是不是字典应该使用无序树或类似的东西?

此外,MSDN声明:

  

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

那么为什么MSDN告诉“订单未指定”但实施恰好保持秩序?我是否正确,我最好不要依赖这个事实?

3 个答案:

答案 0 :(得分:5)

  

我是否正确,我最好不要依赖这个事实?

绝对。仅仅因为有时它保持顺序并不意味着它将在未来的实现中,或者实际上它将在所有情况下立即执行。

调整内部数据结构大小或删除项目时,订单可能会更改。

例如,如果在构造列表之前添加此代码:

values.Remove("apple4");
values.Add("jon", 10);

在我的盒子上,我看到值10来自4之前......即使在之后添加了 5,6和1的条目。

你应该肯定,不依赖于订购。

答案 1 :(得分:2)

您按顺序获取值可能是由于您的数据看起来是有序的。更改混合订单的元素并添加删除其订单将被更改的元素。你不能依赖订单。

答案 2 :(得分:0)

如果您想要这种行为,那么您应该使用显式有序字典。

http://msdn.microsoft.com/en-us/library/system.collections.specialized.ordereddictionary.aspx