使用Linq Aggregate添加List的元素

时间:2014-07-11 07:25:11

标签: c# linq aggregate

据我了解Aggregate扩展方法,我应该可以使用它来遍历集合并对当前和前一个元素执行操作;例如:

var totalSum = myIntCollection.Aggregate( (a,b) => a + b);

然而,可以(如果是这样的话)我可以使用它来添加类属性;例如:

totalSum = MyCollection.Aggregate((a, b) => a.MyInt + b.MyInt);

鉴于MyCollection是List<MyClass>MyClass看起来像这样:

public class MyClass
{
    public string Name { get; set; }
    public int MyInt { get; set; }
}

当我尝试编译上面的语句时,它告诉我它不能隐式地将int转换为MyClass。

所以,我的问题是:为什么会出现这个错误,并且有办法解决它吗?

2 个答案:

答案 0 :(得分:1)

围绕它的方式是

MyCollection.Sum(a => a.MyInt)

答案 1 :(得分:1)

您误解了Aggregate方法的运作方式。它不“对当前和前一个元素执行操作”。

它对累加器当前元素执行操作。

因此,在您的第一个示例var totalSum = myIntCollection.Aggregate( (a,b) => a + b);中,a不是前一个元素;它表示在当前元素(b)之前出现的所有元素的总和。我认为你的误解是由于你的案例中的Aggregate方法是通过添加前两个元素开始的。

无论如何,正如 @Sayse @Jon Skeet 指出的那样,在这种情况下你最好使用Sum

var totalSum = MyCollection.Sum(item => item.MyInt);