字典或KeyedCollection?

Vas*_*sya 57 .net c#

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

Nei*_*eil 74

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

KeyedCollection的这一额外好处确实具有较小的性能成本.在封面下,您需要支付维护词典和列表的费用.

  • 特别是它看起来像Remove()方法是相当低效的 - 它按顺序搜索List以找到要删除的条目,然后将剩余的条目向左移动一个位置.(除了从词典中删除条目之外.) (4认同)

Gie*_*ius 16

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

要点是:

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


zen*_*ndu 7

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

  • Re *“从实体中提取密钥的逻辑保留在一个地方-而维护字典...” *。您可以对字典进行子类化,以添加KeyedCollection的GetKeyForItem之类的方法,以及通过添加的GetKeyForItem来执行Add的第二种方法。这将使字典变成一个“ SelfKeyedDictionary”,*不需要* KeyedCollection所使用的额外存储空间(用于维护收集顺序)。如果您不需要维护订单,那么结果将是卓越的性能(例如“删除”)和内存。 (2认同)

pap*_*zzo 5

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

如果要修改字典后备,请使用此ctor:

protected KeyedCollection(
IEqualityComparer<TKey> comparer,
int dictionaryCreationThreshold)
Run Code Online (Sandbox Code Playgroud)


Shi*_*mmy 5

KeyedCollection当钥匙位于物品本身上时,应使用A。

默认情况下,KeyedCollectionCollection<TItem>字典的包装器。当您使用小型集合和/或您更喜欢直接检索项目时,它KeyedCollection 会提供一个带有参数的构造函数dictionaryCreationThreshold,该参数指示要切换到的集合计数Dictionary
另一个方面KeyedCollection是您可以选择切换键属性(只要它们的类型匹配)。这对于双键项目等很有用。 从性能角度来看,我认为包装字典不会有太多开销,除非您生成一堆KeyedCollection实例,或者如果您使用非常大的集合(有一些内部null检查来确定是否存在一本字典)。
我希望看到的一件事KeyedCollection是 un abstracting 它,但是您可以同样简单地创建通用的具体类型。


小智 -12

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

  • 它是专门为继承而设计的,因此 OP 询问的比较是使用字典和从 KeyedCollection 继承的东西之间的比较。 (13认同)