1

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

让我们称这个类为 ProgressMeasurement,属性是OutstandingItems。有什么方法可以使用聚合函数来完成这个吗?

例如:

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

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

干杯

4

6 回答 6

1

Linq 用于查询,而不是更新。使用传统循环,更新通常更干净:

var runningTotal = 0;
foreach(var item in progressMeasurementList)
{
   runningTotal += item.OutstandingItems 
   item.OutstandingItems = runningTotal));   
}
于 2013-02-07T17:21:22.330 回答
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 回答
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

也许迟到了,但我添加了这个的聚合变体

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

注意:我不知道您是否想用累积总和替换OutstandingItems。我将 sum 放在不同的属性中只是为了便于阅读。

于 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 回答