使用C#/ Linq累积序列的子序列

esu*_*203 4 c# linq sequence

我试图找到处理数字的基于以下要求序列的一种更好的方式:价值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).

Chr*_*ett 6

假设您可以访问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)


Chr*_*ris 5

我的版本是对注释中的内容进行修改并返回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的人.