说,如果我创建一个这样的字典:
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");
答案 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<,>
视为无序键/值对的集合。即使作为实现细节,如果你只是添加值,你通常会按照插入顺序看到它们,你应该不依赖它。
出于枚举的目的,字典中的每个项都被视为表示值及其键的
KeyValuePair<TKey, TValue>
结构。 未定义项目的返回顺序。
(强调我的。)
如果您需要特定订单,则应该使用不同的集合 - 可能与字典结合使用,如果您还需要能够按键获取。 (例如,保持IList<TKey>
和Dictionary<TKey, TValue>
并不是完全不常见的。)
答案 3 :(得分:0)
不,不保证元素顺序。此外,它可以根据IDictionary&lt; ...&gt;的实际实现而不同。接口