Best way to convert Dictionary<string, string> into single aggregate String representation?
Solution 1
This is the most concise way I can think of:
var result = string.Join(", ", map.Select(m => m.Key + ":" + m.Value).ToArray());
If you are using .NET 4+ you can drop the .ToArray()
:
var result = string.Join(", ", map.Select(m => m.Key + ":" + m.Value));
And if you are able to use the newish string interpolation language feature:
var result = string.Join(", ", map.Select(m => $"{m.Key}:{m.Value}"));
However, depending on your circumstances, this might be faster (although not very elegant):
var result = map.Aggregate(new StringBuilder(),
(a, b) => a.Append(", ").Append(b.Key).Append(":").Append(b.Value),
(a) => a.Remove(0, 2).ToString());
I ran each of the above with a varying number of iterations (10,000; 1,000,000; 10,000,000) on your three-item dictionary and on my laptop, the latter was on average 39% faster. On a dictionary with 10 elements, the latter was only about 22% faster.
One other thing to note, simple string concatenation in my first example was about 38% faster than the string.Format()
variation in mccow002's answer, as I suspect it's throwing in a little string builder in place of the concatenation, given the nearly identical performance metrics.
To recreate the original dictionary from the result string, you could do something like this:
var map = result.Split(',')
.Select(p => p.Trim().Split(':'))
.ToDictionary(p => p[0], p => p[1]);
Solution 2
string result = string.Join(", ", map.Select(x => string.Format("{0}:{1}", x.Key, x.Value)).ToArray())
Solution 3
This uses LINQ Aggregate method:
map
.Select(m => $"{m.Key}:{m.Value}")
.Aggregate((m1, m2) => $"{m1}, {m2}");
Same but with string.Format()
:
map
.Select(m => string.Format("{0}:{1}", m.Key, m.Value))
.Aggregate((m1, m2) => string.Format("{0}, {1}", m1, m2))
Comments
-
SliverNinja - MSFT about 4 years
How would I convert a dictionary of key value pairs into a single string? Can you do this using LINQ aggregates? I've seen examples on doing this using a list of strings, but not a dictionary.
Input:
Dictionary<string, string> map = new Dictionary<string, string> { {"A", "Alpha"}, {"B", "Beta"}, {"G", "Gamma"} };
Output:
string result = "A:Alpha, B:Beta, G:Gamma";
-
mccow002 over 12 yearsDidn't see yours before I posted mine. +1 for brilliant thinking :)
-
zipi about 9 yearshow can I back from these var result to original dictionary?
-
Cᴏʀʏ about 9 years@zipi: Edited the question to include a quick way to get back to the original dictionary.