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

6
我可以为您翻译以下内容:

我希望创建一个如下类型的字典,

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
虽然从技术上讲,你可以这样做,但我强烈建议不要在任何需要维护的东西中保留这样的数据结构。将你尝试表示的内容分解成类,这样更容易维护。我知道这似乎很简单,但你没有语义意义来表示每个键和值代表什么,这会给你带来麻烦。 - Craig Suchanec
4个回答

7
问题在于你只尝试向最内层的字典赋值。但是两个外层级别不存在。
你需要明确每个级别:
if (!data.ContainsKey(key1))
    data[key1]  = new Dictionary<string, Dictionary<string, int>();

......等等。这可能有点繁琐,因此如果您需要它,我建议您在字典上创建一个扩展方法,以便轻松完成此操作。

如果您为字典中的键分配值,则会创建该条目。但是,如果您从字典中的键中读取,并且该键不存在,则会引发异常。


+1!我不知道分配一个键会自动创建一个条目! - GETah

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")];

0

你只声明了一个层级的字典,但实际上需要声明每一层级:

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}
                 }
              };

我这里没有编译器,所以我不确定它能否工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接