You have two options:
-
Project to a
stringand then aggregate:var values = new[] { new { Key = "MyAge", Value = 33.0 }, new { Key = "MyHeight", Value = 1.75 }, new { Key = "MyWeight", Value = 90.0 } }; var res1 = values.Select(x => string.Format("{0}:{1}", x.Key, x.Value)) .Aggregate((current, next) => current + ", " + next); Console.WriteLine(res1);This has the advantage of using the first
stringelement as the seed (no prepended “, “), but will consume more memory for the strings created in the process. -
Use an aggregate overload that accepts a seed, perhaps a
StringBuilder:var res2 = values.Aggregate(new StringBuilder(), (current, next) => current.AppendFormat(", {0}:{1}", next.Key, next.Value), sb => sb.Length > 2 ? sb.Remove(0, 2).ToString() : ""); Console.WriteLine(res2);The second delegate converts our
StringBuilderinto astring,using the conditional to trim the starting “, “.