5

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

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

4 回答 4

6

编号来自MSDN(重点是我的)

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

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

于 2013-09-26T21:06:09.040 回答
5

简短的回答是否订单不能保证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]);
}

OrderedDictionary<TKey,TValue>请注意,由于某些奇怪的原因,没有通用版本。但是,这个问题有一些关于如何实现的提示。

于 2013-09-26T21:05:30.737 回答
1

我能保证这样检索这些值:“z1”、“abc9”、“abc8”、“ABC1”吗?

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

文档中:

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

(强调我的。)

如果您需要特定的订单,您应该使用不同的集合 - 如果您还需要能够按键获取,则可能与字典结合使用。IList<TKey>(例如,维护 a和 a并不少见Dictionary<TKey, TValue>。)

于 2013-09-26T21:05:22.600 回答
0

不,不保证元素顺序。此外,根据 IDictionary<...> 接口的实际实现,它可能会有所不同。

于 2013-09-26T21:05:30.977 回答