Best way to convert Dictionary<string, string> into single aggregate String representation?

20,946

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))
Share:
20,946
SliverNinja - MSFT
Author by

SliverNinja - MSFT

Coding with annoyingly high integrity

Updated on May 11, 2020

Comments

  • SliverNinja - MSFT
    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
    mccow002 over 12 years
    Didn't see yours before I posted mine. +1 for brilliant thinking :)
  • zipi
    zipi about 9 years
    how can I back from these var result to original dictionary?
  • Cᴏʀʏ
    Cᴏʀʏ about 9 years
    @zipi: Edited the question to include a quick way to get back to the original dictionary.