2011-12-10 11 views
3

私は、1つのキーに対して複数のデータエントリを保持するデータ構造/クラスを使用するプログラムを作成しようとしています - これは辞書と似ていますが、1対1ではなく1対多の関係です。私は使うことができるクラスを考えようとしていますが、何かを理解することはできません。1対多の関係を表すために使用できるデータ構造/クラスはどれですか?

それはのように見えるかもしれ方法例えば:

私が持っているだろうので、私は別のファイル内のパラメータはxValueと3つの異なる値が設定されています

xValue, <1.txt, 1> 
xValue, <2.txt, 2> 
xValue, <3.txt, 3> 

任意のアイデア?

EDIT: 私はこれを考え出した - すべての後、私は

Dictionary< string , Dictionary<..., ... > >

を使用することができ、できない私が?

+0

確かにネストされた辞書を使うことができますが、 'xValue'がどのファイルから来るのかを知る必要がなければ' HashSet'を取るこ​​とができます。 – Vlad

答えて

3

.NETにはマルチセットがネイティブに存在しないので、私はあなたのケースで

Dictionary<Key, HashSet<XValue>> 

のために行くだろう。

サードパーティのコンテナを使用しても問題ない場合は、hereから回答を参照できます(例:Wintellect PowerCollections)。

1

初期化後にこのコレクションを変更する必要はなく、検索を行うだけでLookup<TKey, TElement>クラスをビルドすることができますが、実際にはIEnumerable<>インスタンスがあり、それをフラット化する場合は非常にトリッキーで便利ですデータ構造を検索するには、とにかくこれは.NETがそのようなinterstingクラスを提供することを覚えておくと非常に便利です。

MSDN

1つまたは複数の値にマッピングされたキーそれぞれのコレクションを表します。 A Lookup<TKey, TElement>は、Dictionary<TKey, TValue>に似ています。 の違いは、Dictionary<TKey, TValue>がキーを単一の の値にマップするのに対し、Lookup<TKey, TElement>はキーを の値のコレクションにマップする点です。

明示的にインスタンス化することはできず、LINQ ToLookup()メソッドを使用してルックアップのインスタンスを取得できます。大きな制限がありますので、このクラスを検索データ構造として使用して検索します。

ルックアップの新しいインスタンスを作成するpublicコンストラクタはありません。さらに、Lookupオブジェクト は変更不可能です。つまり、作成後にLookupオブジェクト から要素またはキーを追加または削除することはできません。

関連する問題