Dot-Net

為什麼 .Net 字典中的條目要另外排序?

  • September 30, 2008

我剛剛看到這種行為,我對此感到有點驚訝……

如果我將 3 或 4 個元素添加到字典,然後執行“For Each”以獲取所有鍵,它們會按照我添加它們的順序出現。

這讓我感到驚訝的原因是 Dictionary 應該是內部的 HashTable,所以我希望事情以任何順序出現(按密鑰的雜湊排序,對嗎?)

我在這裡想念什麼?這是我可以指望的行為嗎?

編輯:好的,我已經想到了可能發生這種情況的許多原因(例如條目的單獨列表,這是否是巧合等)。我的問題是,有人知道這到底是如何工作的嗎?

如果您在 3.5 類庫上使用 .NET Reflector,您可以看到 Dictionary 的實現實際上將項目儲存在一個數組中(根據需要調整大小),並將索引散列到該數組中。獲取密鑰時,它完全忽略雜湊表並遍歷項目數組。出於這個原因,您將看到您所描述的行為,因為新項目被添加到數組的末尾。如果您執行以下操作,則看起來像:

add 1
add 2
add 3
add 4
remove 2
add 5

你會得到 1 5 3 4 因為它重用了空槽。

重要的是要注意,就像許多其他人一樣,您不能指望在未來(或過去)版本中出現這種行為。如果您希望對字典進行排序,那麼為此目的有一個SortedDictionary類。

引用自:https://stackoverflow.com/questions/154307