I've seen the simple example of the .net Aggregate function working like so:
string[] words = { "one", "two", "three" };
var res = words.Aggregate((current, next) => current + ", " + next);
Console.WriteLine(res);
How could the 'Aggregate' function be used if you wish to aggregate more complex types? For example: a class with 2 properties such as 'key' and 'value' and you want the output like this:
"MyAge: 33, MyHeight: 1.75, MyWeight:90"
You have two options:
Project to a string
and 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 string
element 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 StringBuilder
into a string,
using the conditional to trim the starting ", ".