字典或KeyedCollection?

时间:2011-09-27 09:09:19

标签: c# .net

我有一个类(SomeClass),其中包含Name类型的属性string。我需要存储该类的数组并按名称查找其项目。为此,有两种类型的集合:KeyedCollectionDictionary。我的问题是:它们之间有什么区别,在这种情况下最好使用KeyedCollectionDictionary?感谢您提供任何解释帮助。

6 个答案:

答案 0 :(得分:71)

之前的评论都没有解决两者之间最重要的区别: KeyedCollection使您的项目按添加顺序保留(添加的第一项是索引0,最后添加的是最后一个索引)。字典没有(或者至少它不能保证这样做)。

KeyedCollection的额外好处确实具有较小的性能成本。在幕后,您需要支付维护词典和列表的费用。

答案 1 :(得分:16)

以下是关于Dictionary和KeyedCollection之间差异的很好的解释:http://geekswithblogs.net/NewThingsILearned/archive/2010/01/07/using-keyedcollectionlttkey-titemgt.aspx

要点是:

  • KeyedCollection是抽象的,因此您无法直接使用它。
  • KeyedCollection对于案例非常有用,当key在实体本身时,您可以将密钥检索封装在集合实现中。
  • KeyedCollection有一些通用的实现(不在框架中),它允许您在集合构造函数中粘贴密钥检索委托,因此每次添加项目时都不必重复它。

答案 2 :(得分:7)

KeyedCollection允许使用可变密钥和方法来管理密钥更改。字典不允许更改密钥。其次,如果你有一个需要查找的集合,从实体中提取密钥的逻辑仍然在一个地方 - 而维护字典需要在每个从字典中添加/删除项目的地方放置密钥提取逻辑。

答案 3 :(得分:5)

默认情况下,KeyedCollection会在封面下创建一个Dictionary 如果Key还具有作为Value的一部分的含义并且还定义了唯一性,那么这就是KeyedCollection的目的。

如果您想修改词典支持,请使用此ctor:

protected KeyedCollection(
IEqualityComparer<TKey> comparer,
int dictionaryCreationThreshold)

答案 4 :(得分:2)

当密钥位于项目本身时,应使用KeyedCollection

默认情况下,KeyedCollection是字典周围的Collection<TItem>包装器。当您使用小型集合和/或您希望直接检索项目时,KeyedCollection provides a constructor会带有dictionaryCreationThreshold参数,该参数指示要切换到Dictionary的集合数。
KeyedCollection中的另一个方面是您可以选择切换键属性(只要它们的类型匹配)。这对双键物品等有用。 从表面上讲,我不认为包装字典有很多开销,除非你生成了一堆KeyedCollection个实例,或者你使用了非常大的集合(有一些内部null检查确定是否有一本字典) 我希望在KeyedCollection中看到的一件事是abstract,但你可以轻松地制作一个通用的具体类型。

答案 5 :(得分:-12)

你不能使用KeyedCollection,因为它是抽象的:http://msdn.microsoft.com/en-us/library/ms132438.aspx。这意味着您无法创建它的对象。