OrderedDictionary和Dictionary

我正在寻找一种方法来让我的Dictionary按照它们添加的顺序来枚举它的KeyValuePair 。 现在, Dictionary的文档明确指出:

为了枚举的目的,字典中的每个项目都被当作一个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 ,还是必须使用索引?

你做错了。 您不仅需要将值顺序插入到字典中,还需要删除一些元素,并在此之后查看顺序如何更改。 下面的代码演示了这个

 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, value9