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

jav*_*red 3 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]);
            }

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

2
3
4
5
6
1
Run Code Online (Sandbox Code Playgroud)

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

此外,MSDN声明:

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

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

Jon*_*eet 5

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

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

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

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

values.Remove("apple4");
values.Add("jon", 10);
Run Code Online (Sandbox Code Playgroud)

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

绝对应该,绝对不依赖于订购.