我有一个字典,其条目如下所示:
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方式可以做到这一点
答案 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);