C#:将Dictionary <string,string>转换为Dictionary <string,dictionary <string,string =“”>&gt; </string,> </string,string>

时间:2010-10-23 14:03:26

标签: c# linq dictionary lambda

第一个Dictionary就像

        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来执行此操作。

如何使用LNQLAMBDA Expression

执行此操作

3 个答案:

答案 0 :(得分:5)

 var result = ParentDict.GroupBy(p => p.Key[0].ToString())
                        .ToDictionary(g => g.Key, g => g.ToDictionary(x => x.Key, x => x.Value));

答案 1 :(得分:1)

尝试:

var result = from p in ParentDict
             group p by p.Key[0] into g
             select new { Key = g.Key, Value = g };

这应该给你一个{Key,Value}的列表,其中Key将是“A”,“B”,“C”等,而Value将是来自ParentDict的KeyValuePair的原始实例。

您可以在此MSDN页面上找到更多LINQ示例查询: 101 Linq Samples

答案 2 :(得分:1)

我怀疑这样做的原因是因为您需要能够查找特定键字母的所有条目。在这种情况下,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,或返回空的枚举,所有这些都取决于您创建它的方式。