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