のようなジェネリック コレクションを使用したいのですが、すべてのキーが一意である必要Dictionary
があります。Dictionary
同じ「キー」に複数の値があるため、それを可能にする汎用コレクションが必要です。
これにより、キーが実際のキーではなくなっていることはわかっていますが、他に何と呼べばよいかわかりません。
のようなジェネリック コレクションを使用したいのですが、すべてのキーが一意である必要Dictionary
があります。Dictionary
同じ「キー」に複数の値があるため、それを可能にする汎用コレクションが必要です。
これにより、キーが実際のキーではなくなっていることはわかっていますが、他に何と呼べばよいかわかりません。
考慮すべきいくつかのオプション:
Dictionary<TKey, List<TValue>>
—各キーの値のリストを保持し、同じキーの値の重複 (つまり、ペアの重複) を防ぎません。Dictionary<TKey, HashSet<TValue>>
—各キーの値のセットを保持し、同じキーの値が重複しないようにします。List<KeyValuePair<TKey, TValue>>
— ペアのリストを保持し、同じキーの重複値を防止しません。KeyValuePair
後者の場合は astruct
ではなく aであることに注意してくださいclass
。したがって、これは少し異なる処理を意味します。
適切なオプションは、実際のユース ケースによって異なります。
.NET 3.5 以降では、ILookup<TKey,TValue>
. 残念ながら、提供されている実装は immutableのみですがLookup<TKey,TValue>
、再実装は簡単です。AnEditableLookup<TKey,TValue>
はMiscUtilに含まれています。
を使用するILookup<TKey,TValue>
と、TKey
インデクサーはIEnumerable<TValue>
(そのキーに一致するものがない場合でも) を返すため、一般的な使用法は次のとおりです。
foreach(var value in lookup[key])
DoSomethingWith(value);
C++ では、このようなコレクションはマルチマップと呼ばれます。その用語をすばやく検索すると、次の関連する質問が明らかになりました。
自分で作成Dictionary<TKey,List<TValue>>
して手作業を行うことはできますが、デフォルトでは「複数辞書」コレクションはありません。
つまり、IEnumerable がある場合は、説明したようなルックアップに変換できますが、それ自体で構築することはできません (ToLookup() を呼び出して列挙から作成する必要があります)。
試してみてくださいDictionary<KeyType,List<ValueType>>
。
このディクショナリをラップするカスタム ディクショナリを作成して、追加および削除時に必要なすべてのロジックを処理できます。
あなたの価値のために、保持したいもののリストを保存できます。