2013-05-22 42 views
38

我正在寻找一种方法让我的Dictionary按照它们添加的顺序枚举它的KeyValuePair。现在,Dictionary's doc明确指出:OrderedDictionary and 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,还是必须使用索引?

+0

尝试使用*随机*键,在'Add'ing到集合,看到了差距。 – I4V

+0

仅供参考: @ I4V尝试过,并没有改变。 – DeadlyJesus

回答

44

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

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 
+0

如果我只列举字典,该怎么办?根据我的理解,在这种情况下他们的工作方式是相同的。 – DeadlyJesus

+0

@DeadlyJesus通过枚举你的意思是插入值而不删除? –

+0

是的。我在我的例子中所做的或多或少是我在应用程序中执行的操作,我只在字典中添加值,之后不会删除/更改它们。 – DeadlyJesus