5

次のタイプの辞書を作成したいのですが、

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]]
4

4 に答える 4

6

ここでの問題は、最も内側の辞書にのみ割り当てようとしているということです。しかし、外側の 2 つのレベルは存在しません。

各レベルについて明示する必要があります。

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

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

ディクショナリのキーに割り当てると、そのエントリが作成されます。ただし、ディクショナリのキーから読み取った場合、そのキーが存在しない場合は例外が発生します。

于 2012-11-11T19:39:25.947 に答える
3

キーの配布とエントリの数によっては、キーTuple<string, string, string>として使用する方が簡単な場合があります。

var data = new Dictionary<Tuple<string, string, string>, int>();
data[Tuple.Create("key1", "key2", "key3")] = 1;
var itemFromDictionary = data[Tuple.Create("key1", "key2", "key3")];
于 2012-11-11T19:52:06.287 に答える
0

すべてのレベルを宣言する必要がある場合、レベル辞書を 1 つだけ宣言します。

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

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

于 2012-11-11T19:46:07.660 に答える
0

内部レベル値のみを割り当てようとしています。すべてのレベルに割り当てる必要があります。

これを試して:

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

ここにはコンパイラがないので、うまくいくかどうかわかりません。

于 2012-11-11T19:47:20.840 に答える