2012-11-11 14 views
5

で3つのレベルにネスト辞書、は、私は次のタイプの辞書を作成したいのC#

var data = new Dictionary<string, Dictionary<string, Dictionary<string, int>>>(); 

を作成すると、私はKeyNotFound例外を取得します。

data[key1][key2][key3]= 3; 

私はここで間違っていますか?キーが辞書に見つからない場合は、それが自動的に辞書に追加されます。

実行時にキーを追加する方法はありますか?

私は、次のタイプの出力を期待する:

[male,[animal,[legs,4] 

       [eyes,2]] 
     [human,[hands,2] 
       [ears,2]] 

[female,[animal,[nose,1] 

       [eyes,2]] 
     [bird,[wings,2] 
       [legs,2]] 
+1

。私はあなたが維持しなければならない何でもこのようなデータ構造を維持することを強く勧めます。あなたが表現しようとしていることをクラスに分解すれば、これは維持しやすくなります。私はこれが簡単だと理解していますが、それぞれのキーと値が何を表しているのかという意味的意味はなく、頭痛を引き起こします。 –

答えて

6

ここでの問題は、あなたが唯一の最も内側の辞書に代入しようとしているということです。しかし、2つの外部レベルは存在しません。

あなたは、各レベルについての明示する必要がありますように

if (!data.ContainsKey(key1)) 
    data[key1] = new Dictionary<string, Dictionary<string, int>(); 

...と。それは書くのが面倒なこともありますので、たくさん必要な場合は、これを簡単に行うための辞書の拡張メソッドを作成することをお勧めします。

辞書のキーに割り当てると、そのエントリが作成されます。しかし、が辞書内のキーからを読み、そのキーが存在しない場合、例外が発生します。

+0

+1!私はキーを割り当てることによって自動的にエントリが作成されることは知らなかった! – GETah

0

あなたはすべてのレベルを宣言する必要がある唯一の1レベルの辞書、宣言:

var data = new Dictionary<string, new Dictionary<string, new Dictionary<string, int>>>(); 

が、これはあなたを助けることを願っています。

0

内部レベルの値のみを割り当てようとしています。すべてのレベルに割り当てる必要があります。私はそれがうまくいくか分からない、

data["male"] = new[] { 
       {"animal", new[] { 
           {"legs",4}, 
           {"eyes", 2} 
          }, 
       {"human", new[] { 
          {"hands", 2} 
       } 
       }; 

は、私がここにコンパイラを持っていないので:

これを試してみてください。

2

あなたの鍵の配布によると、エントリ数は、キーとしてTuple<string, string, string>を使用する方が簡単かもしれません:あなたはこれを行うcan'dなぜ技術的な理由はありませんが

var data = new Dictionary<Tuple<string, string, string>, int>(); 
data[Tuple.Create("key1", "key2", "key3")] = 1; 
var itemFromDictionary = data[Tuple.Create("key1", "key2", "key3")]; 
関連する問題