2011-05-31 96 views
2

我正在使用SortedDictionary,其中鍵是整數,值是字符串。C#SortedDictionary產生異常結果

SortedDictionary<int,string> dic = new SortedDictionary<int,string>(); 

現在說我添加值喜歡

dic.Add(100,"String 1"); 
dic.Add(1113,"String 2"); 
dic.Add(1,"String 3"); 
dic.Add(70,"String 4"); 

,然後做一個foreach循環就像

foreach(string item in dic.Values) { 
     Console.WriteLine(item); 
} 

那麼值永遠不會按正確的順序走出來,他們在問世幾乎是隨機的順序,這是一個正常的詞典類似的行爲。任何人有任何想法爲什麼?我錯過/做錯了什麼?

PS:當我說這是出來以隨機順序我的意思是關鍵,爲了不值,所以它出來像1113,70,1,100


看來我可能比簡單的問題,但它不應該有所作爲,有很多嵌套涉及,最終字典實際上是另一個字典的孩子,這是另一個字典的孩子!

SortedDictionary<String, SortedDictionary<String, SortedDictionary<int, SortedDictionary<String, String>>>>() 

我正在通過循環的字典是

SortedDictionary<int, SortedDictionary<String, String>> 

這裏是爲要求的循環:

foreach (SortedDictionary<String, String> cDic in openTrades.Values) 
{ 
    String cTimestamp = convertTimestamp(cDic["open"]); 
    if (!closeTrades.ContainsKey(cDic["key"]) && barArray.ContainsKey(cDic["pair"])) 
    { 
      foreach (SortedDictionary<String, String> bDic in barArray[cDic["pair"]][cDic["frame"]].Values) 
      { 
       //This is the relative Loop 
      } 
    } 
} 

barArray是我們的首要SortedDictionary(這個問題的主題) openTrades是另一個SortedDictionary

謝謝 James

+1

如果通過「隨機」,你的意思是你得到了'String3,String4,String1,String2',那麼你就會得到預期的行爲。 – 2011-05-31 20:30:10

+0

你有沒有研究過這個問題?如果是這樣,很高興知道! – Benjol 2012-02-15 09:57:00

回答

8

SortedDictionary排序不是值。

如果你這樣做了以下

foreach(var item in dic) 
{ 
     Console.WriteLine(item.Key + "-" + item.Value); 
} 

你會看到,它的排序順序打印出的關鍵:

1-String 3 
70-String 4 
100-String 1 
1113-String 2 
+0

嗨,這就是我的意思 - 它不是像那樣出來的,它是以隨機的按鍵順序出來的 像1113,70,1,100那樣絕對沒有一致性。 – James 2011-06-01 09:41:50

+0

@James:你可以給最終字典顯示* actual *循環代碼,其他的東西一定是關閉的。 – BrokenGlass 2011-06-01 13:19:25

+0

我已經將它添加到問題的結尾了,謝謝你的幫助 – James 2011-06-01 14:02:08

1

我不知道你怎麼想的輸出是應該的,但對我而言,這是

String 3 
String 4 
String 1 
String 2 

這是正確的。也許你覺得SortedDictionary維持插入順序?快速審查the documentation會告訴你,情況並非如此。這些值通過鍵上的Comparer<T>排序(假設沒有提供自定義比較器)。

+0

嗨,這就是我的意思 - 它不會像那樣出來,它會以一個隨機的關鍵順序像1113,70,1,100那樣出現,絕對沒有一致性 – James 2011-06-01 09:43:08

0

問題出在您的foreach循環中。 SortedDictionary類公開了值列表,但該列表未被排序,因此您只是從未排序的列表中讀取數據。


再次讀碼,我意識到列表在排序順序呈現。我認爲發生的事情是你感到困惑,因爲你不知何故,期望它通過價值領域進行排序。 SortedDictionary通過Key字段進行排序(添加語句中的整數)。

+0

嗨,這就是我的意思 - 它不是像那樣出來的,它是以一個隨機的關鍵順序像1113,70,1,100出來的那樣,絕對沒有一致性 – James 2011-06-01 09:43:39

1

和其他所有人一樣,我的第一印象是,如果字典是按鍵而不是按值排序的,那麼您會感到困惑。但是閱讀你的評論似乎並不是問題。

所以我簡單地(像其他人一樣)將代碼粘貼到Visual Studio中並讓它運行。輸出是(如預期):

String 3 
String 4 
String 1 
String 2 

如果您的機器上的訂單不同,那麼似乎有一些真正奇怪的事情發生在那裏。也許你可以做另一奔跑,但稍作改動你的foreach語句:

foreach (var item in dic) 
{ 
    Console.WriteLine(item); 
} 

現在,在項目,你會得到一個KeyValuePair<int, string>,這將很好地打印出來是這樣的:

[1, String 3] 
[70, String 4] 
[100, String 1] 
[1113, String 2] 

所以你會得到另一個檢查確切的關鍵屬於你得到的每個值,也許找到另一個線索爲什麼你得到一個你不期望的排序。

+0

嗨,我已經添加了一些更多的信息請看看我認爲我過於簡單化了解釋 – James 2011-06-01 11:59:56