如何对嵌套字典键进行分组

时间:2019-07-18 17:27:58

标签: c# asp.net dictionary

我生成了这个序列化字典:

[  
   {  
      "Example":{  
         "Etq":"Demo",
         "Val":123
      },
      "Example2":{  
         "Etq":"Demo2",
         "Val":235
      },
      "Sections[0]":{  
         "Titulo":"Header 1",
         "Data[0]":{  
            "Etq":"lorem ipsum",
            "Val":"temp"
         },
         "Data[1]":{  
            "Etq":"lorem ipsum 2",
            "Val":null
         }
      },
      "Sections[1]":{  
         "Titulo":"Header 2",
         "Data[0]":{  
            "Etq":"lorem ipsum",
            "Val":"56544"
         },
         "Data[1]":{  
            "Etq":"lorem ipsum 367",
            "Val":"temp3334"
         },
         "Data[2]":{  
            "Etq":"Some etq",
            "Val":"Some value"
         }
      }
]

我从数据库中接收以下格式的数据:

  • ColumnName:Example.Etq
  • RowValue:“演示”

所以在C#中,我拆分了该列名,并放入了字符串数组,然后使用var chainNodes传递给我的方法。

这是我做嵌套字典的递归函数:

//Initial parameters "false, ref new Dictionay<string, object>(), ['Example', 'Etq'], 'Demo', 0"
private static object DoCreate(bool nested, ref Dictionary<string, object> row, string[] chainNodes, object value, int index){
        try
        {
            var res = new Dictionary<string, object>();
            var lastE = chainNodes.Length - 1;

            if(index == chainNodes.Length - 1)
            {
                res.Add(chainNodes[index], value);
            }
            else
            {
                if (!nested)
                {
                    var _row = row;
                    int pivot = 0;
                    for(int i = index; i <= lastE; i++)
                    {
                        if(_row.ContainsKey(chainNodes[i]))
                        {
                            _row = ((Dictionary<string, object>)_row[chainNodes[i]]);
                        }
                        else
                        {
                            pivot = i;
                            break;
                        }
                    }

                    if (pivot == lastE)
                        _row.Add(chainNodes[pivot], value);
                    else
                        _row.Add(chainNodes[pivot], DoCreate(true, ref _row, chainNodes, value, pivot + 1));

                    return null;
                }

                res.Add(chainNodes[index], DoCreate(true, ref row, chainNodes, value, index + 1));
            }

            return res;
        }
        catch(Exception)
        {
            throw;
        }
    }

我需要修改以显示此格式:

[  
   {  
      "Example":{  
         "Etq":"Demo",
         "Val":123
      },
      "Example2":{  
         "Etq":"Demo2",
         "Val":235
      },
      "Sections":[  
         {  
            "Titulo":"Header 1",
            "Data":[  
               {  
                  "Etq":"lorem ipsum",
                  "Val":"temp"
               },
               {  
                  "Etq":"lorem ipsum 2",
                  "Val":null
               }
            ]
         },
         {  
            "Titulo":"Header 2",
            "Data":[  
               {  
                  "Etq":"lorem ipsum",
                  "Val":"56544"
               },
               {  
                  "Etq":"lorem ipsum 367",
                  "Val":"temp3334"
               },
               {  
                  "Etq":"Some etq",
                  "Val":"Some value"
               }
            ]
         }
      ]
   }
]

0 个答案:

没有答案