我试图找到处理数字的基于以下要求序列的一种更好的方式:价值sequence[i]是其自身价值的总和加上从积累sequence[0]到sequence[i-1].
例如:如果序列是列表
List<double> list = new List<double> { 10.0, 20.0, 30.0, 40.0 };
Run Code Online (Sandbox Code Playgroud)
输出结果应该是
list[0] = 10.0
list[1] = 20.0 + 10.0
list[2] = 30.0 + 10.0 + 20.0
list[3] = 40.0 + 10.0 + 20.0 + 30.0
Run Code Online (Sandbox Code Playgroud)
我知道使用多次迭代的蛮力方式,但我想知道必须有一些更好的解决方案(可能使用LINQ).
假设您可以访问LINQ:
using System.Linq;
List<int> numbers = new List<int> {10, 20, 30, 40};
List<int> runningTotals = new List<int>(numbers.Count);
numbers.Aggregate(0, (sum, value) => {
sum += value;
runningTotals.Add(sum);
return sum;
});
Run Code Online (Sandbox Code Playgroud)
我的版本是对注释中的内容进行修改并返回IEnumerable而不是List但ToList()将对其进行排序.
应该非常有效率.谁不喜欢用yield return?;-)
public IEnumerable<double> GetCumulativeSequence (IEnumerable<double> input)
{
var runningTotal = 0.0;
foreach (double current in input)
{
runningTotal+=current;
yield return runningTotal;
}
}
void Main()
{
List<double> list = new List<double> { 10.0, 20.0, 30.0, 40.0 };
var foo = GetCumulativeSequence(list);
}
Run Code Online (Sandbox Code Playgroud)
这样做的主要优点是它只在输入数组上进行一次循环.如果你实际上没有使用所有返回的东西(即你只看前三个)那么它将不会计算其余的东西.在更长的列表等方面可能有用.对于像Chris Doggett的答案这样的话也是如此,但并不是所有那些使用linq的人.