C# 使用Linq聚合添加列表元素

C# 使用Linq聚合添加列表元素,c#,linq,aggregate,C#,Linq,Aggregate,根据我对Aggregate扩展方法的理解,我应该能够使用它来迭代集合,并对当前和以前的元素执行操作;例如: var totalSum = myIntCollection.Aggregate( (a,b) => a + b); totalSum = MyCollection.Aggregate((a, b) => a.MyInt + b.MyInt); 但是,我可以(如果可以的话,如何)使用它来添加类属性;例如: var totalSum = myIntCollection.Agg

根据我对
Aggregate
扩展方法的理解,我应该能够使用它来迭代集合,并对当前和以前的元素执行操作;例如:

var totalSum = myIntCollection.Aggregate( (a,b) => a + b);
totalSum = MyCollection.Aggregate((a, b) => a.MyInt + b.MyInt);
但是,我可以(如果可以的话,如何)使用它来添加类属性;例如:

var totalSum = myIntCollection.Aggregate( (a,b) => a + b);
totalSum = MyCollection.Aggregate((a, b) => a.MyInt + b.MyInt);
考虑到MyCollection是一个
列表
MyClass
如下所示:

public class MyClass
{
    public string Name { get; set; }
    public int MyInt { get; set; }
}
当我试图编译上面的语句时,它告诉我它不能隐式地将int转换为MyClass


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

解决这个问题的办法是

MyCollection.Sum(a => a.MyInt)

您误解了聚合方法的作用。它不会“对当前和以前的元素执行操作”

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

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

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

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

老实说,我认为你误解了聚合的目的。现在还不清楚您想要实现什么,但是如果您只是尝试对属性求和,那么
sum
方法肯定是正确的。