3

在审查一个应用程序的代码时,我发现它假定顺序与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 告诉“订单未指定”但实现恰好保持订单?我是否正确,我最好不要依赖这个事实?

4

3 回答 3

5

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

绝对地。仅仅因为有时它保持顺序并不意味着它会在未来的实现中,或者实际上它现在会在所有情况下都这样做。

当内部数据结构调整大小或删除项目时,顺序可能会改变。

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

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

在我的盒子上,我看到值 10 出现在 4 之前的位置……即使它是在5、6 和 1 的条目之后添加的。

绝对应该,绝对不依赖订购。

于 2012-11-17T13:45:11.657 回答
2

您偶然获得按顺序排列的值可能是由于您的数据似乎是有序的。更改混合顺序的元素并添加删除元素,其顺序将被更改。你不能依赖订单。

于 2012-11-17T13:45:19.497 回答
0

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

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

于 2012-11-17T14:02:16.973 回答