我已经看到.net Aggregate函数的简单示例如下:
string[] words = { "one", "two", "three" };
var res = words.Aggregate((current, next) => current + ", " + next);
Console.WriteLine(res);
如果您希望聚合更复杂的类型,如何使用'Aggregate'函数? 例如:一个具有2个属性的类,例如'key'和'value',你想要输出如下:
"MyAge: 33, MyHeight: 1.75, MyWeight:90"
答案 0 :(得分:45)
您有两种选择:
投放到string
,然后汇总:
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);
这样做的好处是可以使用第一个string
元素作为种子(没有前置“,”),但会为进程中创建的字符串消耗更多内存。
使用接受种子的聚合重载,可能是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);
第二位代表将我们的StringBuilder
转换为string,
,使用条件修剪起始“,”。
答案 1 :(得分:4)
Aggregate有3个重载,因此您可以使用具有不同类型的重载来累积您要枚举的项目。
您需要传入种子值(您的自定义类),以及添加将种子与一个值合并的方法。例如:
MyObj[] vals = new [] { new MyObj(1,100), new MyObj(2,200), ... };
MySum result = vals.Aggregate<MyObj, MySum>(new MySum(),
(sum, val) =>
{
sum.Sum1 += val.V1;
sum.Sum2 += val.V2;
return sum;
}
答案 2 :(得分:3)
Aggregate函数接受委托参数。您可以通过更改委托来定义所需的行为。
var res = data.Aggregate((current, next) => current + ", " + next.Key + ": " + next.Value);
答案 3 :(得分:0)
或者使用string.Join():
var values = new[] {
new { Key = "MyAge", Value = 33.0 },
new { Key = "MyHeight", Value = 1.75 },
new { Key = "MyWeight", Value = 90.0 }
};
var res = string.Join(", ", values.Select(item => $"{item.Key}: {item.Value}"));
Console.WriteLine(res);