2010-06-18 24 views
6

.net中是否存在允許存儲KeyValuePair<string, string>保持插入順序的集合?
OrderedDictionary看起來很有前途,但似乎相當缺乏。
現在我正在研究IOrderedEnumerable>,但我似乎無法找到除ISortedDictionary之外的任何實現,但這不是我想要的。不需要進行排序,只是插入順序很重要。排序的Keyvaluepairs列表?

更新
我不喜歡OrderedDictionary的原因是它不是通用的。

+0

OrderedDictionary不排序值,您可以通過索引訪問元素。缺乏什麼? – 2010-06-18 15:01:48

+0

'OrderedDictionary'是爲你正在尋找的東西而設計的,不幸的是它不是通用的。除此之外,還有其他缺失的東西是你想要的嗎?如果你能澄清你要找的東西(以及爲什麼內置的課程不能滿足你的需求),你會得到更好的答案。 – LBushkin 2010-06-18 15:08:57

+0

如果可能的話,我想避開所有的鑄造。 – 2010-06-19 20:36:15

回答

7

OrderedDictionary是你想要什麼,如果你既需要項目鍵控和插入測序訪問...它實際上只是一個哈希表和一個列表的組合。它提供了一種通過插入索引或按鍵訪問項目的方法。這是.NET中唯一的一個集合。可悲的是,它不是通用的。

如果OrderedDictionary僅僅因爲它不是通用的而不能滿足您的需求 - 那麼您可以使用the version here that provides a generic equivalent。如果還有其他原因導致您無法使用,請更新您的帖子,我們可以尋找更好的選擇。

儘管您當然可以創建自己的List<KeyValuePair<string,string>>,但您將失去使用密鑰有效搜索的選項。現在,你當然可以推出你自己的一個有序的doctionary的實現,它將list/dict結合在一起......但是我已經鏈接到的帖子已經完成了這個。

+0

這很好地總結了我的選擇。因爲無論如何我都不需要重點查找,所以我要和IList一起去。謝謝 – 2010-06-19 20:37:58

7

只需使用List<KeyValuePair<T,T>>。它們按插入順序存儲。每次添加它時,都會將最新的一個添加到列表的末尾。

所以

var list = new List<KeyValuePair<String,String>>(); 

list.Add(new KeyValuePair<String,String>("","")); 

如果你想拉出來,以便只需使用:

list.ForEach(x=>...); 

foreach(var item in list){ 
...} 
+0

List保持秩序是否保證? – 2010-06-19 20:35:12

+1

是的,它必須,因爲你可以直接訪問元素,就像你做一個數組List [0] ..等一樣。 – kemiller2002 2010-06-19 21:21:56

0

你應該只能夠使用List<KeyValuePair<string,string>>。我實際上並不能找到MSDN文檔指出的插入順序的保證,但它是一個非常安全的賭注...

6

儘管我遲到了遊戲,但.NET Framework 4.5爲您提供了新的類。見SortedList<TKey, TValue>SortedDictionary<TKey, TValue>。如果你想知道你應該使用哪一個,MSDN提供了幾個很好的理由,爲什麼你可以選擇一個。

SortedList泛型類是具有O(log n)檢索的鍵/值對的數組,其中n是字典中元素的數量。在這裏,它與SortedDictionary泛型類相似。這兩個類具有相似的對象模型,並且都具有O(log n)檢索。其中兩個類的區別是在插入和移除的存儲器使用和速度:

  • SortedList<TKey, TValue>使用較少的內存比SortedDictionary<TKey, TValue>
  • SortedDictionary<TKey, TValue>對於未排序的數據O(log n)有更快的插入和刪除操作,而O(n)對應於SortedList<TKey, TValue>
  • 如果列表從排序數據一次全部填充,則SortedList<TKey, TValue>SortedDictionary<TKey, TValue>更快。

SortedDictionary<TKey, TValue>SortedList<TKey, TValue>類之間的另一個區別是SortedList<TKey, TValue>支持通過由鍵返回的集合的鍵和值的高效的索引檢索和值的屬性。當訪問屬性時不必重新生成列表,因爲列表只是內部鍵和值的數組的封裝器。

兩個鏈接都有類似的備註部分(這是引用來自哪裏)。他們也有兩個班的更多信息。如果你有興趣使用其中的一個,我建議你閱讀這兩部分。