使用Linq Aggregate或ForEach更新正在运行的总计的属性

时间:2013-02-07 16:58:48

标签: c# linq aggregate running-total

我有一个带整数属性的类。我有一个将在图表应用程序中使用的列表。我希望将此属性显示为累计总数,同时保留所有其他类信息。

我们称这个类为ProgressMeasurement,属性为OutstandingItems。有没有一些方法,使用Aggregate函数我可以完成这个?

例如:

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

即。我想将b的OutstandingItems值更新为当前运行总计。

干杯

6 个答案:

答案 0 :(得分: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));

答案 1 :(得分:1)

Linq用于查询,而非更新。对于传统循环,更新通常更简洁:

var runningTotal = 0;
foreach(var item in progressMeasurementList)
{
   runningTotal += item.OutstandingItems 
   item.OutstandingItems = runningTotal));   
}

答案 2 :(得分:0)

那将是.Sum()方法:

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

答案 3 :(得分:0)

我会在foreach中这样做。 Linq查询不应该用于更改源。

var runningTotal = progressMeasurementList.First().OutstandingItems;
foreach(var progressMeasurement in progressMeasurementList.Skip(1))
{
    runningTotal += progressMeasurement.OutstandingItems;
    progressMeasurement.OutstandingItems = runningTotal;
}

答案 4 :(得分:0)

也许迟到但我添加了此

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

注意:我不知道你想用累积金额替换OutstandingItems。为了便于阅读,我将总和放在不同的属性中。

答案 5 :(得分:0)

您可以尝试使用ForEach方法,如下所示:

int runningTotal = 0;
progressMeasurementList.ForEach(item =>
                                    {
                                        runningTotal += item.OutstandingItems;
                                        item.OutstandingItems = runningTotal;
                                    });