如何将一个字典转换为另一个字典的最佳方法?

5
我有一个词典,其中的条目看起来像这样:

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"

正如您所看到的:在第一个字典中,第一部分键和值之间总是存在一对一的映射关系,因此不会发生冲突。

使用LINQ创建第二个字典的最简单方法是什么?

我可以手动循环遍历每个记录并解析出新的键并创建每个新记录,但我想知道是否有一种使用LINQ的方式。


1
@ooo:你是怎么做到的? - Mitch Wheat
通过循环遍历字典中的每个键并解析出新键,然后将值设置为新字典中的值,但我认为LINQ会有更优雅的方法。 - leora
我本意是“请发布你的代码”,但没关系。 - Mitch Wheat
4行代码使用循环,1行代码使用LINQ(在底层运行循环,可能效率较低)。 - Mitch Wheat
@ooo:您对重复的键有什么期望? - Mitch Wheat
3个回答

10
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;
}

2
"+1 虽然普通的 foreach 循环可能更易读和高效,但意图更加清晰。" - Mitch Wheat

4

一个简单的方法是使用Select方法来生成您所需的KeyValuePair,结合ToDictionary使用。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接