我想创建一个以下类型的字典,
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]]
答案 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}
}
};
我这里没有编译器,因此,我不确定它是否可行。