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