Linq SUM对象?

我有一个代表商业数据的对象。

基本上,它是一个聚集一些总数的对象:

public class MyClass{ public double MyDataOne {get;set;} public double MyDataTwo {get;set;} public double MyDataThree {get;set;} public static MyClass operator +(MyClass data1, MyClass data2){ return new MyClass{MyDataOne = data1.MyDataOne + data2.MyDataOne, MyDataTwo=data1.MyDataTwo+data2.MyDataTwo, MyDataThree=data1.MyDataThree+data2.MyDataThree }; } } 

现在,如果我有一个IEnumerable myClasses ,是否有一些我可以在MyClass中实现这一点:?

 myClasses.Sum(d=>d); 

因为对我来说,添加对象的方式必须是对象的知识,而不是调用者的知识(如果有一天我有一个数据更多,我不想查看我的整个代码来查看它的使用位置) 。

谢谢

编写自己的扩展方法:

 public static MyClass Sum(this IEnumerable source) { var result = new MyClass(); // all data will be zeros foreach(var item in source) result = result + item; return result; } 

用法:

 var sum = myClasses.Sum(); 

您可以编写自己的扩展方法来封装对IEnumerable.Aggregate调用,然后调用重载的operator +

 public static MyClass Sum(this IEnumerable collection) { return collection.Aggregate((a, b) => a + b); } 

这可以通过以下方式调用:

 MyClass sum = myClasses.Sum(); 

或者甚至更进一步,概括,并包括一个选择器:

 public static MyClass Sum(this IEnumerable collection, Func selector) { return collection.Aggregate(new MyClass() /*start with an empty MyClass*/, (a, b) => a + selector(b)); } 

这可以按照你的建议调用:

 MyClass sum = myClasses.Sum(d => d); 

以及包含MyClass复杂类型,例如:

 class Foo { public MyClass Bar {get; set;} public int Baz {get; set;} } var FooList = new List(); MyClass sumOfFooListsBars = FooList.Sum(f => f.Bar); 

为了使用Sum你应该提供Func delegate,其中###intlongfloatdoubledecimal或它们可以为空的对应物。 所以你无法以你想要的方式使用MyClass

Sum方法的所有重载Sum返回我上面提到的基本类型。 这就是为什么总结自定义对象没有意义,而返回类型也不是数字而是自定义对象。