我有一個類(SomeClass
),其中包含string
類型的屬性Name
。我需要存儲該類的數組,並按名稱查找它的項目。爲此,有兩種類型的收藏:KeyedCollection
和Dictionary
。我的問題是:他們之間有什麼區別,在這種情況下最好使用KeyedCollection
和Dictionary
?感謝您的解釋幫助。Dictionary or KeyedCollection?
回答
您不能使用KeyedCollection,因爲它是抽象的:http://msdn.microsoft.com/en-us/library/ms132438.aspx。這意味着你不能創建它的一個對象。
它是專門爲繼承而設計的,因此OP詢問的比較是在使用字典和從KeyedCollection繼承的某個字符之間。 – mattmc3
以下是有關解釋和KeyedCollection之間的差異很好的解釋:http://geekswithblogs.net/NewThingsILearned/archive/2010/01/07/using-keyedcollectionlttkey-titemgt.aspx
要點是:
- KeyedCollection是抽象的,所以你不能直接使用它。
- KeyedCollection適用於以下情況:當key在實體本身中時,則可以將密鑰檢索封裝在collection實現中。
- KeyedCollection有一些通用的實現(雖然不在框架中),它允許您將關鍵檢索委託粘貼到集合構造函數中,因此每次添加項目時都不必重複。
默認情況下,KeyedCollection會在封面下創建一個Dictionary。
如果Key也具有作爲Value的一部分的含義並且還定義了唯一性,那麼這就是KeyedCollection的用途。
如果你要修改的字典後盾然後使用這個構造函數:
protected KeyedCollection(
IEqualityComparer<TKey> comparer,
int dictionaryCreationThreshold)
先前的評論都沒有解決兩者之間最重要的區別: KeyedCollection保持在其是爲了你的項目添加(第一個項目添加在索引0,最後一個添加在最後一個索引)。字典沒有(或者至少從未保證這麼做)。
KeyedCollection的額外好處確實具有很小的性能成本。在封面下,你需要支付維護詞典和列表的費用。
KeyedCollection允許可變鍵和方法來管理鍵的變化。字典不允許更改密鑰。其次,如果你有一個需要查找的集合,從實體中提取關鍵字的邏輯仍然在一個地方 - 而維護字典需要在每個地方添加/刪除項目的關鍵提取邏輯。
當鑰匙在物品上時應使用KeyedCollection
。
默認情況下,KeyedCollection
是圍繞字典的Collection<TItem>
包裝。當您使用小集合和/或您更願意直接檢索項目時,KeyedCollection
provides a constructor需要dictionaryCreationThreshold
參數,該參數指示在哪個集合計數下切換到Dictionary
。
KeyedCollection
的另一個方面是您可以選擇切換鍵屬性(只要它們的類型匹配)。這對於雙鍵控項目等是很好的。 Performancewise,我不認爲包裝字典有很多開銷,除非您生成一堆KeyedCollection
實例,或者如果您使用非常大的集合(有一些內部null
檢查來確定是否有字典)。
我希望在KeyedCollection
中看到的一件事情是,它可以使通用的具體類型變得簡單。
- 1. 嘗試實現來自Keyedcollection的Serializble DIctionary,無法添加對象
- 2. 帶MutableKey的KeyedCollection
- 3. Sorting HTML table or Dictionary keys to make specific layout
- 4. DataBinding wpf KeyedCollection
- 5. KeyedCollection字符串大小寫不敏感
- 6. KeyedCollection是什麼的集合?
- 7. KeyedCollection和d:DataContext設計錯誤
- 8. 派生類的泛型KeyedCollection
- 9. Lock Dictionary in Dictionary - ConcurrentDictionary
- 10. 「Dictionary」Undeclared
- 11. 在Dictionary
- 12. Dictionary and KeyValuePair
- 13. TestFirst.org Dictionary Dictionary關鍵字示例Ruby
- 14. NSMutableDictionary * dictionary = @ {}。mutableCopy VS NSMutableDictionary * dictionary = [NSMutableDictonary new]
- 15. Vba Dictionary not finding key
- 16. Json反序列化形式Dictionary <string,Dictionary <string,string >>
- 17. Django:Haystack or OR
- 18. Excel VBA - Dictonary.Exists(Dictionary)?
- 19. Python - Dictionary to NodeTree
- 20. python dictionary count
- 21. NSJSONSerialization into swift dictionary
- 22. python csv into dictionary
- 23. Python Dictionary Ordered Pairs
- 24. 陣列DIctionary
- 25. Word Dictionary Library AS3
- 26. python/sets/dictionary/initialization
- 27. OrderedDictionary and Dictionary
- 28. Python split()for dictionary
- 29. F#ExpandoObject as Dictionary
- 30. C#Ordered dictionary index
KeyedCollection的一個(有些模糊的)優點,至少如果你有對序列化過程的控制,你只需要序列化List <>部分並且「在線上」發送它。沒有必要序列化或發送Dictionary <>部分,因爲它可以在接收端重建,作爲List <>部分反序列化的一部分。 – RenniePet