将一个字典转换为另一个字典的最佳方法是什么

时间:2011-05-30 23:54:41

标签: c# linq string parsing dictionary

我有一个字典,其条目如下所示:

dictionary["ABC.123"] = "Test"
dictionary["DEF.123"] = "Test2"
dictionary["EFG.123"] = "Test3"
dictionary["EFG.343"] = "Test3"
dictionary["ABC.456"] = "Test"

我希望创建一个如下所示的新字典:(基本上解析出“。”之前的开头字符串,并将其创建为键并使用相同的值。

dictionary["ABC"] = "Test"
dictionary["DEF"] = "Test2"
dictionary["EFG"] = "Test3"

正如您所看到的:第一个字典中键的第一部分与值之间始终存在1到1的映射,因此不存在冲突

使用LINQ转换为从第一个字段创建第二个字典的最简单方法是什么?

我可以手动遍历每个记录并解析出新密钥并创建每个新记录,但我认为有一种LINQ方式可以做到这一点

3 个答案:

答案 0 :(得分:7)

var newDict = dictionary.GroupBy(kvp => kvp.Key.Remove(kvp.Key.IndexOf('.')))
                        .ToDictionary(grp => grp.Key, grp => grp.First().Value);

虽然普通foreach可能更具可读性和效率:

var newDict = new Dictionary<string, string>();
foreach (var kvp in dictionary)
{
    newDict[kvp.Key.Remove(kvp.Key.IndexOf('.'))] = kvp.Value;
}

答案 1 :(得分:2)

var dict2 = dictionary.GroupBy(x => x.Key.Split('.')[0])
                      .ToDictionary(g => g.Key, g => g.First().Value);

答案 2 :(得分:2)

一种简单的方法是使用Select方法与ToDictionary一起生成所需的KeyValuePair

var response = dictionary
              .Select(kvp => new KeyValuePair<string, string>(kvp.Key.Remove(kvp.Key.IndexOf('.')), kvp.Value))
              .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);