据我了解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。
所以,我的问题是:为什么会出现这个错误,并且有办法解决它吗?
答案 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);