将Dictionary 转换为单个聚合字符串表示的最佳方法?

如何将键值对的字典转换为单个字符串? 你能用LINQ聚合做到这一点吗? 我已经看到使用字符串列表执行此操作的示例,但不是字典。

输入:

Dictionary map = new Dictionary { {"A", "Alpha"}, {"B", "Beta"}, {"G", "Gamma"} }; 

输出:

  string result = "A:Alpha, B:Beta, G:Gamma"; 

这是我能想到的最简洁的方式:

 var result = string.Join(", ", map.Select(m => m.Key + ":" + m.Value).ToArray()); 

如果您使用的是.NET 4+,则可以删除.ToArray()

 var result = string.Join(", ", map.Select(m => m.Key + ":" + m.Value)); 

如果您能够使用新的字符串插值语言function:

 var result = string.Join(", ", map.Select(m => $"{m.Key}:{m.Value}")); 

但是,根据您的具体情况,这可能会更快(虽然不是很优雅):

 var result = map.Aggregate(new StringBuilder(), (a, b) => a.Append(", ").Append(b.Key).Append(":").Append(b.Value), (a) => a.Remove(0, 2).ToString()); 

我在你的三项词典上和我的笔记本电脑上运行了上述各项迭代次数(10,000; 1,000,000; 10,000,000),后者的平均速度提高了39%。 在包含10个元素的字典中,后者仅快了约22%。

另外需要注意的是,我的第一个例子中的简单字符串连接比mccow002的答案中的string.Format()变化快了大约38%,因为我怀疑它在一个小字符串构建器中代替串联,因为它几乎完全相同性能指标。

要从结果字符串重新创建原始字典,您可以执行以下操作:

 var map = result.Split(',') .Select(p => p.Trim().Split(':')) .ToDictionary(p => p[0], p => p[1]); 
 string result = string.Join(", ", map.Select(x => string.Format("{0}:{1}", x.Key, x.Value)).ToArray()) 

这使用LINQ Aggregate方法 :

 map .Select(m => $"{m.Key}:{m.Value}") .Aggregate((m1, m2) => $"{m1}, {m2}"); 

string.Format()相同但是:

 map .Select(m => string.Format("{0}:{1}", m.Key, m.Value)) .Aggregate((m1, m2) => string.Format("{0}, {1}", m1, m2))