在C#中创建三级嵌套字典

时间:2012-11-11 19:37:25

标签: c# dictionary

我想创建一个以下类型的字典,

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 个答案:

答案 0 :(得分:6)

这里的问题是你只是想分配到最里面的字典。但是这两个外层并不存在。

您需要明确每个级别:

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

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

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

答案 1 :(得分:2)

根据您的密钥分配和条目数量,可能更容易使用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")];

答案 2 :(得分:0)

当你需要声明每个级别时,你只声明1级字典:

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

希望这会对你有所帮助。

答案 3 :(得分:0)

您正尝试仅分配内部级别值。您必须分配到所有级别。

试试这个:

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

我这里没有编译器,因此,我不确定它是否可行。