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

这里的问题是您只是试图分配给最里面的字典。但是外在的两个层次是不存在的。

您需要明确每个级别:

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

... 等等。写起来可能有点麻烦,所以如果你经常需要它,我建议你在字典上创建一个扩展方法,让你轻松做到这一点。

如果您分配给字典中的键,则会创建该条目。但是,如果您从字典中的某个键中读取,并且该键不存在,则会出现异常。

于 2012-11-11T19:39:25.947 回答
3

Tuple<string, string, string>根据您的密钥分配和条目数,使用 a作为密钥可能更容易:

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 回答