2013-05-22 38 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