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方式
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)
一个简单的方法是使用 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)