gpt4 book ai didi

c# - 具有运算符+的对象的Linq SUM?

转载 作者:太空狗 更新时间:2023-10-29 18:27:09 24 4
gpt4 key购买 nike

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

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

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> myClasses , 有什么我可以在 MyClass 中实现的:?

myClasses.Sum(d=>d);

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

谢谢

最佳答案

您可以编写自己的扩展方法来包装对 IEnumerable<T>.Aggregate 的调用这又会调用您的重载 operator + :

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

这将被调用:

MyClass sum = myClasses.Sum();

或者甚至更进一步,泛化并包含一个选择器:

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

以及来自包含 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);

关于c# - 具有运算符+的对象的Linq SUM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17717858/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com