9

のようなジェネリック コレクションを使用したいのですが、すべてのキーが一意である必要Dictionaryがあります。Dictionary同じ「キー」に複数の値があるため、それを可能にする汎用コレクションが必要です。

これにより、キーが実際のキーではなくなっていることはわかっていますが、他に何と呼べばよいかわかりません。

4

6 に答える 6

20

考慮すべきいくつかのオプション:

  • a を使用Dictionary<TKey, List<TValue>>—各キーの値のリストを保持し、同じキーの値の重複 (つまり、ペアの重複) を防ぎません。
  • a を使用Dictionary<TKey, HashSet<TValue>>—各キーの値のセットを保持し、同じキーの値が重複しないようにします。
  • a を使用List<KeyValuePair<TKey, TValue>>— ペアのリストを保持し、同じキーの重複値を防止しません。

KeyValuePair後者の場合は astructではなく aであることに注意してくださいclass。したがって、これは少し異なる処理を意味します。

適切なオプションは、実際のユース ケースによって異なります。

于 2011-03-02T22:30:30.183 に答える
8

.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);
于 2011-03-02T22:38:31.690 に答える
4

C++ では、このようなコレクションはマルチマップと呼ばれます。その用語をすばやく検索すると、次の関連する質問が明らかになりました。

.NET のマルチマップ

于 2011-03-02T22:29:48.403 に答える
2

自分で作成Dictionary<TKey,List<TValue>>して手作業を行うことはできますが、デフォルトでは「複数辞書」コレクションはありません。

つまり、IEnumerable がある場合は、説明したようなルックアップに変換できますが、それ自体で構築することはできません (ToLookup() を呼び出して列挙から作成する必要があります)。

于 2011-03-02T22:28:36.843 に答える
0

試してみてくださいDictionary<KeyType,List<ValueType>>

このディクショナリをラップするカスタム ディクショナリを作成して、追加および削除時に必要なすべてのロジックを処理できます。

于 2011-03-02T22:28:09.450 に答える
0

あなたの価値のために、保持したいもののリストを保存できます。

于 2011-03-02T22:28:44.707 に答える