21

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";
SliverNinja - MSFT
  • 31,051
  • 11
  • 110
  • 173

3 Answers3

49

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]);
Cᴏʀʏ
  • 105,112
  • 20
  • 162
  • 194
8
string result = string.Join(", ", map.Select(x => string.Format("{0}:{1}", x.Key, x.Value)).ToArray())
mccow002
  • 6,754
  • 3
  • 26
  • 36
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))
Ray
  • 187,153
  • 97
  • 222
  • 204