字典或KeyedCollection?

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

以前的评论都没有提到两者之间最重要的区别:KeyedCollection保持您的项目按添加的顺序(第一项添加在索引0,最后一项添加在最后一个索引处)。 词典不(或至less从不保证这样做)。

KeyedCollection的额外好处确实有一个小的性能成本。 在封面下,你要支付维护词典和列表的费用。

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

要点是:

  • KeyedCollection是抽象的,所以你不能直接使用它。
  • KeyedCollection对于情况很有用,当key在实体本身中时,则可以将密钥检索封装在集合实现中。
  • KeyedCollection有一些通用的实现(不是在框架中),它允许你将关键的检索委托粘贴到集合构造函数中,所以你不必每次添加条目都重复一遍。

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

如果你想修改字典支持,然后使用这个ctor:

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

KeyedCollection允许可变的密钥和方式来pipe理密钥的变化。 字典不允许更改密钥。 其次,如果你有一个需要查询的集合,从实体中提取关键字的逻辑保持在一个地方 – 而维护字典需要把关键的提取逻辑放在每个地方添加或删除项目的地方。

当键位于项目本身时,应该使用KeyedCollection

默认情况下, KeyedCollection是一个词典的Collection<TItem>包装。 当您使用小集合和/或您更喜欢直接检索项目时, KeyedCollection 提供了一个构造函数 , 该构造函数接受一个dictionaryCreationThreshold参数,该参数指示要切换到Dictionary集合数。
KeyedCollection另一个方面是可以select切换键属性(只要它们的types匹配)。 这可以是双键控项目等。Performancewise,我不认为包装字典有很多开销,除非你生成一堆KeyedCollection实例,或者如果你使用真正的大集合(有一些内部的null检查,以确定是否有一本字典)。
我希望在KeyedCollection看到的一件事就是不要abstract它,但是你可以使一个通用的具体types变得简单。

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