2011-09-27 7 views
49

私はNameのタイプのプロパティを含むクラス(SomeClass)を持っています。そして、私はそのクラスの配列を格納し、その名前で項目を見つける必要があります。この目的のために、KeyedCollectionDictionaryの2種類のコレクションがあります。私の質問は次のようなものです:それらの場合とその場合の違いKeyedCollectionDictionaryを使用する方が良いですか?説明の助けをありがとう。辞書またはKeyedCollection?

+2

KeyedCollectionの利点は、少なくともシリアライゼーションプロセスを制御している場合は、List <>部分をシリアライズして「ワイヤで」送信すればよいことです。 List <>部分を直列化または送信する必要はありません。List <>部分の逆シリアル化の一部として受信側で再構築できるからです。 – RenniePet

答えて

-11

KeyedCollectionは抽象的であるため使用できません:http://msdn.microsoft.com/en-us/library/ms132438.aspx。つまり、オブジェクトを作成することはできません。ここで

+11

これは継承のために特別に設計されたものなので、OPが尋ねる比較は、KeyedCollectionから継承したものと辞書を使用することです。 – mattmc3

14

は辞書とKeyedCollectionの違いについての良い説明は次のとおりです。http://geekswithblogs.net/NewThingsILearned/archive/2010/01/07/using-keyedcollectionlttkey-titemgt.aspx

主なポイントは以下のとおりです。

  • KeyedCollectionは抽象的なので、あなたはそれを直接使用することはできません。
  • KeyedCollectionは、キーがエンティティ自体にある場合に便利です。次に、キーの取得をコレクションの実装内にカプセル化できます。
  • KeyedCollectionの一般的な実装はありますが(フレームワークではありません)、キー取得デリゲートをコレクションコンストラクタに貼り付けることができるので、アイテムを追加するたびに繰り返す必要はありません。
5

デフォルトでは、KeyedCollectionは、表の下にディクショナリを作成します。
KeyがValueの一部として意味を持ち、一意性を定義している場合は、それがKeyedCollectionの目的です。

あなたは辞書のバッキングを変更したい場合は、このctorのを使用しては:前のコメントの

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

なし2間の最も重要な違いに対処していない: KeyedCollectionは、彼らがされた順にアイテムを保持します追加された最初のアイテムはインデックス0にあり、最後に追加されたアイテムは最後のインデックスに追加されます。ディクショナリは(または少なくともそれを行うことは保証されていません)。

このようなKeyedCollectionの利点は、パフォーマンスの低下につながります。カバーの下では、ディクショナリとリストの両方を維持するコストを負担します。

+0

答えとしてマークする必要があります。 – Ted

+3

特に、Remove()メソッドはむしろ非効率的です。リストを順に検索して削除するエントリを見つけ出し、残りのエントリを1つ左の位置にシフトします。 – RenniePet

+0

"KeyedCollectionのパフォーマンスコストはわずかですが、これは使用方法によって異なります。例えば、foreachループで過度に使用されている場合など、辞書よりも若干優れたパフォーマンスを発揮するかもしれません(http://stackoverflow.com/a/15904926/340045)right? – Ben

4

KeyedCollectionは、変更可能なキーとキーの変更を管理する方法を許可します。辞書はキーの変更を許可しません。第2に、ルックアップを必要とするコレクションがある場合、エンティティからキーを抽出するロジックは1つの場所に残ります。辞書を維持すると、アイテムが辞書に追加/削除される各場所にキー抽出ロジックを配置する必要があります。

0

KeyedCollectionは、キーがアイテム自体にあるときに使用する必要があります。

既定では、KeyedCollectionは、辞書を囲むラッパーです(Collection<TItem>)。小さなコレクションを使用したりアイテムを直接取得したりする場合は、dictionaryCreationThresholdパラメータを取り、Dictionaryに切り替えるコレクションの数を示すKeyedCollectionprovides a constructorが必要です。
KeyedCollectionのもう1つの特徴は、(その型が一致している限り)キーのプロパティを切り替えることができるということです。これは二重キー項目などに適しています。 KeyedCollection個のインスタンスを生成する場合や、実際に大きなコレクションを使用する場合(辞書があるかどうかを調べるために内部のnullチェックがある場合を除く)は、パフォーマンスライブラリをラップするとオーバーヘッドが大きくなるとは思われません。
私がKeyedCollectionで見ることを望むことの1つはun abstractですが、一般的なコンクリートタイプを簡単にすることができます。