2016-04-10 77 views
1

This StackOverflow答案完全描述了HashSet是無序的,其項目枚舉順序是未定義的,不應該依賴。HashSet是否在枚舉之間保持順序?

然而,

這帶來anouther問題:我應該還是我不應該依賴於兩個sebsequent枚舉之間的enumeraetion順序?鑑於沒有插入或清除。

例如,可以說我增加了一些項目到HashSet:

HashSet<int> set = new HashSet<int>(); 
set.Add(1); 
set.Add(2); 
set.Add(3); 
set.Add(4); 
set.Add(5); 

現在,當我通過foreach枚舉此集合,讓我們說,我收到此序列:

// Result: 1, 3, 4, 5, 2. 

問題是:如果我沒有插入/刪除,我是否再次枚舉集合,那麼這個命令是否會保留? 它會永遠是一樣的

+5

即使這是真的,那應該被記錄下來。既然不是,我不會依賴它。隨着未來的框架更新,它可能會隨時出現在你面前。爲什麼在地球上你會使用散列,如果你需要一個保證的枚舉順序。根據您的要求,這絕對是您選擇用於建模數據的錯誤數據結構。 –

+1

由於哈希集合基本上是一個具有固定時隙順序的哈希表,是的,如果根本不修改集合,則迭代順序是恆定的。你應該依賴那個嗎?不,我不這麼認爲,你應該避免必須依賴這一點。 – poke

+0

那麼,我試圖只依靠一個集合的兩個順序枚舉的順序,就是這樣。我需要的數據結構是O(1)add/remove加上上述問題的肯定答案。有沒有? – AgentFire

回答

2

實際上,它在枚舉之間可能總是相同的,但是在IEnumerable的描述中沒有提供該假設,並且實現者可以決定以任何它想要的順序返回。

誰知道它在底層做什麼,以及它是否會繼續以相同的方式在未來做。例如,HashSet的未來實現可能會被優化以檢測低內存條件並重新排列內存中的內容,從而影響它們返回的順序。所以99.9%的時間他們會回來的訂單,但如果你開始耗盡內存資源,它會突然以不同的順序返回的東西。

底線是我不會依賴於枚舉的順序是隨着時間的推移一致的。如果訂單對您來說很重要,那麼您可以通過set.OrderBy(x => x)進行調整,以確保它符合您的要求。