我有一个具有整数属性的类。我有一个列表,它们将在图表应用程序中使用。我希望将此属性显示为累计总数,同时保留所有其他类信息。
让我们将此类称为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放在不同的属性中。