Linq SUM对象?

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)

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

谢谢

lc.*_*lc. 6

您可以编写自己的扩展方法来包装一个调用,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)


Ser*_*kiy 5

编写自己的扩展方法:

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)

  • @wudzik`YAGNI` :)他只有一个这种行为的商务舱 (2认同)