要抓住的是构建Key
字符串,就好像它是命名空间一样。使用递归执行此操作是我当前的实现,但我确信有更多的堆栈友好选项(LINQ?迭代?),我还没有找到。几乎每个例子都过于简单,并没有考虑基于密钥层次结构“命名”它们的能力。
这是我字典布局的快速示例。希望这很容易理解 - 我想要彻底。
我转换类似于此的JSON(嵌套,通过线路保存数据):
"entity": {
"foo": {
"bar": {
"baz": {
"2": "description",
"1": "title"
}
}
进入Dictionary<string,object>
。当Value is string
时,那就是“命名空间”的结尾。对这个对象的详细,令人困惑的看法:
[0] {[entity, Dictionary[String,Object]]} KeyValuePair<string,object>
Key "entity" string
Value Count = 1 object {Dictionary<string,object>}
[0] {[foo, Dictionary[String,Object]]} KeyValuePair<string,object>
Key "foo" string
Value Count = 12 object {Dictionary<string,object>}
[0] {[bar, Dictionary[String,Object]]} KeyValuePair<string,object>
Key "bar" string
Value Count = 1 object {Dictionary<string,object>}
[0] {[baz, Dictionary[String,Object]]} KeyValuePair<string,object>
Key "baz" string
Value Count = 3 object {Dictionary<string,object>}
[0] {[3, title]} KeyValuePair<string,object>
Key "3" string
Value "title" object {string}
此KeyValuePair
最终会成为:"entity.foo.bar.baz.title.3", "3"
答案 0 :(得分:0)
这只是一个简单的树木步道。递归实现应该如下所示:
static void Main( string[] args )
{
Dictionary<string,object> nested = LoadNestedDictionary() ;
Dictionary<string,string> flat = new Dictionary<string, string>() ;
Flatten(nested,flat) ;
return;
}
/// <summary>
/// The wrapper method. Invoke this from your code
/// </summary>
/// <param name="input"></param>
/// <param name="output"></param>
private static void Flatten( IEnumerable<KeyValuePair<string,object>> input , Dictionary<string,string> output )
{
foreach ( KeyValuePair<string,object> item in input )
{
string key = item.Key ;
object value = item.Value ;
if ( value is string )
{
output.Add(key,(string)value) ;
}
else if ( value is Dictionary<string,object> )
{
Flatten( key , (IEnumerable<KeyValuePair<string,object>>) value , output ) ;
}
else
{
throw new InvalidOperationException();
}
}
return ;
}
/// <summary>
/// The core method. Called only from the wrapper method
/// </summary>
/// <param name="root"></param>
/// <param name="input"></param>
/// <param name="output"></param>
private static void Flatten( string root , IEnumerable<KeyValuePair<string,object>> input , Dictionary<string,string> output )
{
foreach ( KeyValuePair<string,object> item in input )
{
string segment = item.Key ;
string key = root + "." + segment ;
object value = item.Value ;
if ( value is string )
{
string s = (string) value ;
output.Add(key,s) ;
}
else if ( value is Dictionary<string,object> )
{
Dictionary<string,object> d = (Dictionary<string,object>) value ;
Flatten(key,d,output);
}
else
{
throw new InvalidOperationException();
}
}
return ;
}