我有一个类(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