2011-11-07 57 views
3

我想一切都在標題中...是否有一個IDictionary實現可以按照它們添加的順序保存鍵? (不排序順序)

我知道Dictionary<TKey,TValue>確實保持鍵的順序,但只要你不刪除任何,而且無論如何這種行爲是沒有記錄並且不能被依賴(詳情見this question)。

基本上,我應該使用什麼樣的集合,如果我想要一個有序的鍵/值對集合,同時保持O(1)的訪問時間? (List<KeyValuePair<K,V>>不是一個好的選擇,因爲它會有O(n)的訪問時間)。我不認爲在BCL中有這樣的事情,但我只想確保在我推出自己的產品之前......

只是爲了讓大家清楚:我不希望鑰匙是排序,我只是希望他們保持秩序。所以SortedList/SortedDictionary不是我要找的...

回答

2

你可能只是保留一個ListDictionary,它允許你查找鍵在列表中的位置?這將允許您按照添加的順序獲取鍵/值對,但仍然保持查找。

+0

是的,我想這是一個很好的選擇,謝謝! –

+0

最終我使用了'LinkedList '而不是簡單的'List ',但這個想法是一樣的...... –

+0

'LinkedList <>'?你有沒有基準刪除? –

0

您可以使用一個SortedDictionarywith a custom IComparer來維護插入順序。當然,您是否想將自己包裝在更方便的界面中取決於您。

+0

謝謝,但我沒有看到IComparer會如何知道插入順序......您是否有一種實現? –

+0

既然你自己實現了'IComparer',並且你知道插入順序,你當然可以讓一個知道插入順序的人。再次,可能需要一些包裝以方便用戶使用。 – Domenic

2

如果你可以接受非通用的,那麼System.Collections.Specialized.OrderedDictionary可以做你所需要的。否則,我會試圖編寫一個包含列表和字典的包裝器,使用GetEnumerator的列表和索引器的字典。

+0

謝謝,它似乎是我正在尋找...太糟糕了,它不是通用的:(。 –

+0

我想我可以寫一個通用的包裝,但由於拳擊,我會失去值類型的性能,所以我想我將最終實現我自己的... –

+0

@ThomasLevesque - 泛型集合通常不需要裝箱 –

1

所以,你不想要一個關聯容器,並且順序完全基於插入順序...爲什麼你不簡單地使用基本數組?

+2

我假設查找也可能是按鍵,它不一定與int-index相同 –

+0

正如Marc所說,我想要按鍵查找項目;事先不知道有多少項目,因此數組不是一個實際的選項。 –

1

「添加順序」通常不是一個字典的問題,所以不要指望一個int std庫。

這當然是可能的,但總是會以犧牲性能爲代價。如果您發現O(1)查找重要,我會建議包含Dictionary<K,V>和耦合List<K>的包裝。添加和刪​​除將變得更慢。

+0

謝謝,這可能是我要做的 –

+0

其實,添加和刪除不一定要慢:我使用了'LinkedList >'和一個'Dictionary >>',所以所有的操作都是O(1),除非我錯過了一些東西......(除非需要通過索引訪問,但它不是) –

+0

O(1),是的。但具有不同的常量。 –

相關問題