.NET的字典中的元素是否顺序?

时间:2013-09-26 21:03:29

标签: c# .net dictionary

说,如果我创建一个这样的字典:

Dictionary<string, MyClass> dic = new Dictionary<string, MyClass>();

dic.add("z1", val1);
dic.add("abc9", val2);
dic.add("abc8", val3);
dic.add("ABC1", val4);

所以当我这样做时:

foreach (KeyValuePair<string, MyClass> kvp in dic)
{
}

我保证会检索这些值:“z1”,“abc9”,“abc8”,“ABC1”?

如果我第一次这样做,那会是:“z1”,“abc8”,“ABC1”?

dic.Remove("abc9");

4 个答案:

答案 0 :(得分:6)

没有。来自MSDN(强调我的)

  

出于枚举的目的,字典中的每个项都被视为   表示值及其值的KeyValuePair<TKey, TValue>结构   键。 退回商品的顺序未定义

如果您想要更多地控制迭代顺序,可能需要查看OrderedDictionary类。

答案 1 :(得分:5)

简短的回答是。 <{1}}不保证订单,也不指望维护订单。

您可能希望改为check into Dictionary<TKey, TValue>

示例:

OrderedDictionary

请注意,由于某些奇怪的原因,没有通用的OrderedDictionary d = new OrderedDictionary(); d.Add("01", "First"); d.Add("02", "Second"); d.Add("03", "Third"); d.Add("04", "Fourth"); d.Add("05", "Fifth"); for(int i = 0; i < d.Count; i++) // Print values in order { Console.WriteLine(d[i]); } 版本。但是,this question有一些关于如何实现它的提示。

答案 2 :(得分:1)

  

我保证会检索这些值:“z1”,“abc9”,“abc8”,“ABC1”?

绝对不是。始终将Dictionary<,>视为无序键/值对的集合。即使作为实现细节,如果你只是添加值,你通常会按照插入顺序看到它们,你应该依赖它。

来自documentation

  

出于枚举的目的,字典中的每个项都被视为表示值及其键的KeyValuePair<TKey, TValue>结构。 未定义项目的返回顺序。

(强调我的。)

如果您需要特定订单,则应该使用不同的集合 - 可能与字典结合使用,如果您需要能够按键获取。 (例如,保持IList<TKey>Dictionary<TKey, TValue>并不是完全不常见的。)

答案 3 :(得分:0)

不,不保证元素顺序。此外,它可以根据IDictionary&lt; ...&gt;的实际实现而不同。接口