C#填充动态嵌套的字典,深度未知

时间:2015-04-15 09:06:42

标签: c# dictionary

我得到一个节点数组和一个值到我的方法中,它必须嵌套到一个字典结构中。但我真的需要这里的逻辑帮助。

我做了一个静态测试,显示我需要的东西:

public static Dictionary<string, object> CreateNestedDictionary(string[] chainNodes, string value)
{
    // Testvalues:
    // ["application", "deepNode", "evenDeeperNode"], "Value"
    var container = new Dictionary<string, object>();
    container.Add("application", new Dictionary<string, object>() { { "deepNode", new Dictionary<string, string>(){{"evenDeeperNode", "Value" } }}});

    return container;
 }

基本上,我有一个Dictionary<string, object>变量,它可以包含无数个相同类型的词典。最后,我需要一个Dictionary<string, string>来定义最后一个节点和值。 按节点我的意思是字典的关键。这些将在JSON Sctructure中表示。

问题是,我不知道chainNodes中有多少元素。此外,我可能需要多次调用此方法并添加更多节点。然后我会有几个必须进入相同字典结构的chainNodes。然后我必须确保钥匙保持独特。

有没有简单的方法可以动态填充此结构?甚至是一个处理这个问题的LINQ方法? 任何建议都非常感谢。提前谢谢

更新

在评论之后,我意识到我做了一个非常糟糕的工作来解释这个。 这是另一个例子:

public static Dictionary<string, object> CreateNestedDictionary(string[] chainNodes, string value)
{
    // Testvalues:
    // ["application", "deepNode", "evenDeeperNode"], "Value"
    var container = new Dictionary<string, object>();
    for (int i = 0; i < chainNodes.Length; i++)
    {
        if (i != chainNodes.Length -1)
        {
            container.Add(chainNodes[i], new Dictionary<string, object>()); // fill this empty Dictionary
        }
        else
        {
            container.Add(chainNodes[i], value);
        }

    }
}

添加最后一个词典很容易,但我不知道如何填写第一个词典。

3 个答案:

答案 0 :(得分:1)

如果我已正确理解这一点:chainNodes是一个名称列表,value位于最深的字典中(名称为chainNodes[chainNodes.Length-1])。

总结:你需要迭代和特殊情况下最深的节点。

递归可能是最简单的,从纯创建案例开始(无需检查现有条目)。

 public Dictionary<string, object> CreateNestedDictionary(string[] chainNodes, object value) {
   return DoCreate(chainNodes, value, 0);
 }

 private Dictionary<string, object> DoCreate(string[] chainNodes, object value, int index) {
   var res = new Dictionary<string, object>();
   if (index == chainNodes.Length - 1) {
     // Bottom out the recursion
     res.Add(chainNodes[index], value);

   } else {
      res.Add(chainNodes[index], DoCreate(chainNodes, value, index+1));
   }
   return res;
 }

递归自然允许你使用最后一个字符串的特殊情况,因为这是递归必须具有的最终情况。

要添加到现有的集合案例,您需要将递归更改为:

  • 传递当前节点
  • 检查是否存在chainNodes[index]密钥并使用该条目或创建新条目。

答案 1 :(得分:0)

您可以从chainNodes中删除第一个值,如果还有更多值,则递归调用该方法,直到结束。

我和@Blorgbeard在一起,尽管如此,这是一个糟糕的结构。

public static Dictionary<string, object> CreateNestedDictionary(string[] chainNodes, string value)
{
    // Testvalues:
    // ["application", "deepNode", "evenDeeperNode"], "Value"
    var key = chainNodes.First();
    chainNodes = chainNodes.Skip(1).ToArray();
    return new Dictionary<string, object> { { key, chainNodes.Any() ? CreateNestedDictionary(chainNodes, value) : value } };    
}

答案 2 :(得分:0)

这就是我实现无限嵌套字典的方式。
我的结构是:is_conforming (t1, t2: TYPE [detachable ANY]): BOOLEAN do Result := ({REFLECTOR}.type_of_type ({REFLECTOR}.detachable_type (t1.type_id))).conforms_to ({REFLECTOR}.type_of_type ({REFLECTOR}.detachable_type (t2.type_id))) end ,以Dict([bool],object)结尾。

[bool] = true

将新Dict保存为父对象很重要,这样您就可以将其添加到在上一次迭代中创建的新父对象。