9

ビジネス データを表すオブジェクトがあります。

基本的に、これはいくつかの合計を集計するオブジェクトです。

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

私にとって、オブジェクトが追加される方法は、呼び出し元ではなくオブジェクトの知識でなければならないためです(ある日、もう1つのデータがある場合、コード全体を調べて、それがどこで使用されているかを確認したくありません) .

ありがとうございました

4

4 に答える 4

6

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);
于 2013-07-18T08:09:03.683 に答える
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;
}

使用法:

var sum = myClasses.Sum();
于 2013-07-18T08:03:55.160 に答える
0

使用するには、デリゲートをSum提供する必要があります。そのため、思い通りの使い方ができません。Func<MyClass, ###>###intlongfloatdoubledecimalMyClass

メソッドのすべてのオーバーロードは、Sum上で述べたプリミティブ型を返します。そのため、戻り値の型が数値ではなくカスタム オブジェクトでもある場合に、カスタム オブジェクトを合計しても意味がありません。

于 2013-07-18T08:12:17.917 に答える