我正在寻找一种方法,让我的Dictionary按照添加的顺序枚举它的KeyValuePair。现在,字典文献明确指出:
出于枚举的目的,字典中的每个项都被视为表示值及其键的
KeyValuePair<TKey, TValue>结构。返回项的顺序未定义。
我发现我需要的是一个OrderedDictionary,但作为一个怀疑论者,我决定自己尝试一下:
OrderedDictionary od = new OrderedDictionary();
Dictionary<String, String> d = new Dictionary<String, String>();
for (int i = 0; i < 10; i++)
{
od.Add("key" + i, "value" + i);
d.Add("key" + i, "value" + i);
}
System.Console.WriteLine("OrderedDictionary");
foreach (DictionaryEntry de in od) {
System.Console.WriteLine(de.Key + ", " + de.Value);
}
System.Console.WriteLine("Dictionary");
foreach (var tmp in d) {
System.Console.WriteLine(tmp.Key + ", " + tmp.Value);
}输出:
OrderedDictionary
key0, value0
key1, value1
key2, value2
...
Dictionary
key0, value0
key1, value1
key2, value2
...正如您所看到的,两者都是有序的,这就引出了两个问题:
在哪种情况下,Dictionary给出的顺序与添加值的顺序不同?我的第一个foreach循环是否保证以相同的顺序检索KeyValuePair,还是必须使用索引?
发布于 2013-05-22 14:23:54
你做错了。您不仅需要顺序地将值插入字典中,还需要删除一些元素,并查看在此之后顺序是如何更改的。下一段代码演示了以下内容:
OrderedDictionary od = new OrderedDictionary();
Dictionary<String, String> d = new Dictionary<String, String>();
Random r = new Random();
for (int i = 0; i < 10; i++)
{
od.Add("key" + i, "value" + i);
d.Add("key" + i, "value" + i);
if (i % 3 == 0)
{
od.Remove("key" + r.Next(d.Count));
d.Remove("key" + r.Next(d.Count));
}
}
System.Console.WriteLine("OrderedDictionary");
foreach (DictionaryEntry de in od) {
System.Console.WriteLine(de.Key + ", " +de.Value);
}
System.Console.WriteLine("Dictionary");
foreach (var tmp in d) {
System.Console.WriteLine(tmp.Key + ", " + tmp.Value);
}打印类似的内容(OrderedDictionary总是有序的):
OrderedDictionary
key3, value3
key5, value5
key6, value6
key7, value7
key8, value8
key9, value9
Dictionary
key7, value7
key4, value4
key3, value3
key5, value5
key6, value6
key8, value8
key9, value9https://stackoverflow.com/questions/16694182
复制相似问题