J4N*_*J4N 8 .net c# linq oop 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 };
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我有一个IEnumerable<MyClass> myClasses
,是否有一些我可以在MyClass中实现这一点:?
myClasses.Sum(d=>d);
Run Code Online (Sandbox Code Playgroud)
因为对我来说,添加对象的方式必须是对象的知识,而不是调用者的知识(如果有一天我有一个数据更多,我不想查看我的整个代码以查看它的使用位置) .
谢谢
您可以编写自己的扩展方法来包装一个调用,IEnumerable<T>.Aggregate
该调用又调用您的重载operator +
:
public static MyClass Sum(this IEnumerable<MyClass> collection)
{
return collection.Aggregate((a, b) => a + b);
}
Run Code Online (Sandbox Code Playgroud)
这可以通过以下方式调用:
MyClass sum = myClasses.Sum();
Run Code Online (Sandbox Code Playgroud)
或者甚至更进一步,概括,并包括一个选择器:
public static MyClass Sum<T>(this IEnumerable<T> collection,
Func<T, MyClass> selector)
{
return collection.Aggregate(new MyClass() /*start with an empty MyClass*/,
(a, b) => a + selector(b));
}
Run Code Online (Sandbox Code Playgroud)
这可以按照你的建议调用:
MyClass sum = myClasses.Sum(d => d);
Run Code Online (Sandbox Code Playgroud)
以及包含MyClass
例如的复杂类型:
class Foo
{
public MyClass Bar {get; set;}
public int Baz {get; set;}
}
var FooList = new List<Foo>();
MyClass sumOfFooListsBars = FooList.Sum(f => f.Bar);
Run Code Online (Sandbox Code Playgroud)
编写自己的扩展方法:
public static MyClass Sum(this IEnumerable<MyClass> source)
{
var result = new MyClass(); // all data will be zeros
foreach(var item in source)
result = result + item;
return result;
}
Run Code Online (Sandbox Code Playgroud)
用法:
var sum = myClasses.Sum();
Run Code Online (Sandbox Code Playgroud)