在审查一个应用程序的代码时,我发现它假定顺序与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未指定值的顺序,但它Dictionary<TKey, TValue>.KeyCollection与Keys属性返回的关联键的顺序相同.
那么为什么MSDN告诉"订单未指定"但实施恰好保持秩序?我是否正确,我最好不要依赖这个事实?
我是否正确,我最好不要依赖这个事实?
绝对.仅仅因为有时它保持顺序并不意味着它将在未来的实现中,或者实际上它将在所有情况下立即执行.
调整内部数据结构的大小或删除项目时,订单可能会更改.
例如,如果在构造列表之前添加此代码:
values.Remove("apple4");
values.Add("jon", 10);
在我的盒子上,我看到值10来自4之前......即使它是在 5,6和1的条目之后添加的.
你绝对应该,绝对不依赖于订购.