1

私はDataSetいくつかの行と列を持っています(データセットが持っている傾向があるように)。各列の合計を使用して、下部に集計行を作成する必要があります。これを単一のLINQ式で実行したいのは、コードの束を単純化するためです。次のように、1つの列の合計を取得できます。

var a = (from m in month
         where <some long expression>
         select m["BGCO_MINUTES"] as Decimal?).Sum();

ただし、他の列の合計も必要です。複雑なwhere句も含まれているため、複数のLINQ式を使用したくありません。また、さまざまな式を使用して複数の集計行を実行しており、このセットを1回だけループしたいと考えています。また、これらの集計行の多くを作成しているので、データセットを手動でループして合計を合計したくありません。

私が欲しいのは、との合計を含む匿名BGCO_MINUTESタイプ800IB_MINUTESですTSDATA_MINUTES

これを行う方法はありますか?

4

2 に答える 2

2

柔軟性が高いため、Sumの代わりにAggregateを使用します。各行を反復処理するときに個々の列の合計を保持するオブジェクト(または単にディクショナリ)を持つことができます。

(コンパイルされていないコードが先にあります)

class SumObject { 
  public float First; 
  public float Second; 
}

var filtered = (from m in month
     where <some long expression>
     select m;

filtered.Aggregate(new SumObject(), (currentSum, item)=> { 
  currentSum.First += item.First;  
  currentSum.Second += item.Second;
  return currentSum;
});
于 2012-07-07T00:49:37.880 に答える
2

あなたはこれを行うことができます:

// run the filters once and get List<DataRow> with the matching rows
var list = (from m in month
            where <some long expression>
            select m).ToList();

// build the summary object
var result = new {
    BGCO_MINUTES = list.Sum(m => m["BGCO_MINUTES"] as Decimal?),
    _800IB_MINUTES= list.Sum(m => m["800IB_MINUTES"] as Decimal?),
}

そして、それはあなたのwhere句がタイプするのに長いだけでなく、評価するのに計算コストがかかると仮定しています。これにより、列ごとに1回リストが繰り返されます

リストを本当に1回だけ繰り返したい場合は、おそらくEnumerable.Aggregateを使用して行うことができますが、コードはそれほどエレガントではありません(私の意見では)。

// run the filters once and get List<DataRow> with the matching rows
var a = (from m in month
         where <some long expression>
         select m)
        .Aggregate(           new { BGCO_MINUTES  = (decimal?)0m,
                                   _800IB_MINUTES = (decimal?)0m },
                    (ac,v) => new { BGCO_MINUTES  = ac.BGCO_MINUTES + (decimal?)v["BGCO_MINUTES"],
                                  _800IB_MINUTES = ac._800IB_MINUTES + (decimal?)v["800IB_MINUTES"] });

私が言ったように、それは最初のバージョンよりもエレガントではないと思いますが、それはうまくいくはずです。最初のものはwhere句(メモリコスト)に一致する値の一時的なコピーを必要とし、1は各フィールド(CPUコスト)のリストを通過しますが、後者のバージョンよりもはるかに読みやすいと思います-必ず理解しにくいバージョンを使用する前に、パフォーマンスの違いはそれだけの価値があります。

于 2012-07-07T01:02:48.253 に答える