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

leo*_*ora 3 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"
Run Code Online (Sandbox Code Playgroud)

我想创建一个如下所示的新字典:(基本上解析出"."之前的开始字符串,并将其创建为键并使用相同的值.

dictionary["ABC"] = "Test"
dictionary["DEF"] = "Test2"
dictionary["EFG"] = "Test3"
Run Code Online (Sandbox Code Playgroud)

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

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

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

Luk*_*keH 8

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

虽然平原foreach可能会更具可读性和效率:

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

  • +1"虽然简单的foreach可能会更具可读性和效率:"意图更清晰. (2认同)

Art*_*ald 6

一个简单的方法是使用 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);
Run Code Online (Sandbox Code Playgroud)