Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对象上的Linq SUM?_C#_.net_Linq_Oop_Sum - Fatal编程技术网

C# 对象上的Linq SUM?

C# 对象上的Linq SUM?,c#,.net,linq,oop,sum,C#,.net,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){ retur

我有一个表示业务数据的对象

基本上,它是一个包含一些总数的对象:

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 MyClass
,我可以在MyClass中实现一些东西来实现它吗

myClasses.Sum(d=>d);
因为对我来说,添加对象的方式必须是对象的知识,而不是调用方的知识(如果有一天我还有一个数据,我不想查看整个代码来查看它的使用位置)


谢谢你

写下你自己的扩展方法:

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;
}

您可以编写自己的扩展方法来包装对
IEnumerable.Aggregate
的调用,该方法反过来调用重载的
运算符+

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

甚至更进一步,概括并包含选择器:

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));
}
以及包含
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);
class-Foo
{
公共MyClass条{get;set;}
公共int Baz{get;set;}
}
var-whoolist=新列表();
MyClass SumofFoolistBars=愚人主义者.Sum(f=>f.Bar);

为了使用
Sum
,您应该提供
Func
委托,其中
###
int
long
float
double
decimal
或其可为空的对应项。 因此,您无法以您想要的方式使用
MyClass


Sum
方法的所有重载返回我上面提到的基元类型。这就是为什么在返回类型不是数字而是自定义对象时对自定义对象求和没有意义的原因。

它解释了一些事情,如果您还可以通过引入称为
ISumable
的接口使其更通用,并对所有
IEnumerable进行通用扩展,其中t:ISumable
:)@wudzik
YAGNI
:)他只有一个商务舱behavior@wudzik非常感谢。我只想补充一点,我创建了一个接口,以确保我求和的类实现了一个
sum
方法,该方法在参数中采用IEnumerable列表。像这样,我不会创建很多中间元素
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));
}
MyClass sum = myClasses.Sum(d => d);
class Foo
{
    public MyClass Bar {get; set;}
    public int Baz {get; set;}
}

var FooList = new List<Foo>();

MyClass sumOfFooListsBars = FooList.Sum(f => f.Bar);