1

整数プロパティを持つクラスがあります。チャート作成アプリケーションで使用されるそれらのリストがあります。他のすべてのクラス情報を保持しながら、このプロパティを累積合計として表示したいと思います。

このクラスをProgressMeasurementと呼び、プロパティはOutstandingItemsです。これを達成できる集計関数を使用する方法はありますか?

例えば:

progressMeasurementList.Aggregate((a, b) =>  b.OutstandingItems += a.OutstandingItems));

bつまり、のOutstandingItems値を現在の現在の合計になるように更新したいと思います。

乾杯

4

6 に答える 6

1

何も組み込まれていませんが、独自の拡張メソッドを作成できます。

public static IEnumerable<TAccum> Scan<T, TAccum>(this IEnumerable<T> seq, TAccum init, Func<TAccum, T, TAccum> op)
{
    TAccum current = init;
    foreach(T item in seq)
    {
        current = op(current, item);
        yield return current;
    }
}

次に、累積合計のシーケンスを次のように計算できます。

var runningTotals = progressMeasurementList.Scan((acc, b) =>  acc + b.OutstandingItems));
于 2013-02-07T17:15:36.533 に答える
1

Linqはクエリ用であり、更新用ではありません。更新は通常、従来のループを使用するとよりクリーンになります。

var runningTotal = 0;
foreach(var item in progressMeasurementList)
{
   runningTotal += item.OutstandingItems 
   item.OutstandingItems = runningTotal));   
}
于 2013-02-07T17:21:22.330 に答える
0

それが.Sum()方法です:

var sum = progressMeasurementList.Sum(prog => prog.OutstandingItems);

于 2013-02-07T17:02:16.013 に答える
0

私はでそれをしforeachます。Linqクエリを使用してソースを変更しないでください。

var runningTotal = progressMeasurementList.First().OutstandingItems;
foreach(var progressMeasurement in progressMeasurementList.Skip(1))
{
    runningTotal += progressMeasurement.OutstandingItems;
    progressMeasurement.OutstandingItems = runningTotal;
}
于 2013-02-07T17:18:44.380 に答える
0

遅くなるかもしれませんが、Iamはこれの集約バリアントを追加します

    int total = 0;
    t.Aggregate(total, (acc, current) =>
        {
            acc+= current.OutstandingItems;
            current.CumulativeOutstandingItems = acc;
            return acc;
        });

注:OutstandingItemsを累積合計に置き換えるかどうかはわかりません。読みやすくするために、合計を別のプロパティに入れました。

于 2013-02-07T17:19:59.530 に答える
0

ForEach次のような方法を試してみることができます。

int runningTotal = 0;
progressMeasurementList.ForEach(item =>
                                    {
                                        runningTotal += item.OutstandingItems;
                                        item.OutstandingItems = runningTotal;
                                    });
于 2013-02-07T18:04:34.880 に答える