C#:字典的转换<字符串,字符串>到词典<字符串,字典<字符串,字符串>>
第一Dictionary
就像C#:字典的转换<字符串,字符串>到词典<字符串,字典<字符串,字符串>>
Dictionary<String, String> ParentDict = new Dictionary<String, String>();
ParentDict.Add("A_1", "1");
ParentDict.Add("A_2", "2");
ParentDict.Add("B_1", "3");
ParentDict.Add("B_2", "4");
ParentDict.Add("C_1", "5");
我需要此转换为一个新的Dictionary<String, Dictionary<String,String>>
结果将包含
Key Value
Key Value
_________________________________________________
"A" "A_1" "1"
"A_2" "2"
"B" "B_1" "1"
"B_2" "2"
"C" "C_1" "1"
现在我使用nested for loop
来做到这一点。
我如何使用LNQ
或LAMBDA Expression
来做到这一点?
var result = ParentDict.GroupBy(p => p.Key[0].ToString())
.ToDictionary(g => g.Key, g => g.ToDictionary(x => x.Key, x => x.Value));
+1做什么问。 – 2010-10-23 14:29:54
尝试:
var result = from p in ParentDict
group p by p.Key[0] into g
select new { Key = g.Key, Value = g };
这应该给你{键,值},其中重点将是 “A”, “B” 的列表, “C”,等等,和值将是一个原来自ParentDict的KeyValuePair实例。
你可以找到这个MSDN页面上更多LINQ查询示例:101 Linq Samples
之所以要做到这一点,我怀疑是因为你需要能够查找所有项特定键字母。在这种情况下,一个Lookup
是更好的匹配,一般为:
var letterLookup = ParentDict.ToLookup(kv=>kv.Key[0]);
可用这样的:
//letterLookup['A'] is an IEnumerable<KeyValuePair<string,string>>...
Console.WriteLine(string.Join(", ",
letterLookup['A'].Select(kv=>kv.ToString()).ToArray()
)); // [A_1, 1], [A_2, 2]
Console.WriteLine(new XElement("root",
letterLookup['B'].Select(kv=>new XElement(kv.Key,kv.Value))
));// <root><B_1>3</B_1><B_2>4</B_2></root>
Console.WriteLine(letterLookup['B'].Any()); //true
Console.WriteLine(letterLookup['Z'].Any()); //false
查找在字典的优点是,它可以包含任何键多个值(与字典不同),并且如果某个键不存在,则它具有一致的API:然后返回空的枚举,而包含枚举的字典可能会抛出KeyNotFoundException,或者返回null,或者返回空的枚举,全部取决于你是如何创建它的。
@ Eamon Nerbonne:哦对不起...那不是原因(我知道'lookup')。其实我的要求就是这样............. – 2010-10-23 14:22:56
最后,我会将数据(以第二个字典的格式)转储到一个xml文件.....(这个xml文件是具有第二个词典的结构) – 2010-10-23 14:29:12
查找有什么问题? – 2010-10-23 14:30:36
为什么你需要这个数据结构? – 2010-10-23 14:26:31
我问的原因是嵌套字典通常比带有复合键或查找的单深度字典慢和不太合适。 – 2010-10-23 14:29:31