【发布时间】:2015-10-29 18:03:19
【问题描述】:
我经常看到这样一段代码作为在 c# 中聚合对象枚举的示例:
IEnumerable<MyCoolObject> myObjects = new List<MyCoolObject>()
{new MyCoolObject(){Value1=1, Value2=10}, new MyCoolObject(){Value1=2, Value2=20}};
MyCoolObject aggregatedObject = myObjects.Aggregate(new MyCoolObject(), (accumlator, next) => new MyCoolObject()
{
Value1=accumlator.Value1 + next.Value1,
Value2=accumlator.Value2 + next.Value2
}
我对这种方法的问题是它每次迭代都会创建一个新的 MyCoolObject,这似乎是一种巨大的浪费。
另一个常见的例子是:
MyCoolObject aggregatedObject = new MyCoolObject()
{
Value1=myObjects.Sum(x=>x.Value1),
Value2=myObjects.Sum(x=>x.Value2)
}
这会重复我的集合两次,这也是一种很大的浪费,尤其是如果我的对象上有更多字段要聚合。
我的想法是,我可以这样做:
MyCoolObject aggregatedObject = myObjects.Aggregate(new MyCoolObject(), (accumlator, next) =>
{
accumlator.Value1 += next.Value1;
accumlator.Value2 += next.Value2;
return accumlator;
};
这会创建一个累加器对象,对其进行处理,并在完成后返回它。对我来说,这看起来与手动 foreach 循环的性能相当。 我很惊讶,我不经常看到这个解决方案。此解决方案是否会引入任何问题,可以解释这一点?
【问题讨论】:
-
1) 您发布的示例不常见。 2) 您的代码还为每个输入行创建一个临时对象。是错字吗? 3) 常见用法是将当前值加到累加器中,返回累加器
-
@PanagiotisKanavos 我怀疑他建议的代码中的对象创建只是一个错字。除此之外,我同意你的看法。 :)
-
确实,新对象的创建是一个错字。永远不要复制粘贴你的坏例子。
标签: c# performance linq aggregation