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



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

让我们将此类称为ProgressMeasurement,其属性为OutstandingItems。有没有一些方法,使用Aggregate函数可以实现这一点?

例如:

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

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

干杯

没有任何内置内容,但您可以创建自己的扩展方法:

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

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

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

这将是.Sum()方法:

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

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

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

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

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

也许会推迟,但我会添加这个的聚合变体

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

注意:我不知道你是否要用累计和替换OutstandingItems。为了可读性,我把sum放在不同的属性中。

相关内容

  • 没有找到相关文章