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
方法肯定是正确的。