スティーブン・スウェンセンの答えは素晴らしいです.スキャンはまさにあなたが必要としているものです. シードを必要としない別のバージョンのスキャンがありますが、これは正確な問題により少し適しています。
このバージョンでは、出力要素のタイプが入力要素のタイプと同じである必要があり、これはあなたの場合であり、0 を渡してから最初の (0) 結果をスキップする必要がないという利点があります。
次のように、このバージョンのスキャンを C# で実装できます。
public static IEnumerable<T> Scan<T>(this IEnumerable<T> Input, Func<T, T, T> Accumulator)
{
using (IEnumerator<T> enumerator = Input.GetEnumerator())
{
if (!enumerator.MoveNext())
yield break;
T state = enumerator.Current;
yield return state;
while (enumerator.MoveNext())
{
state = Accumulator(state, enumerator.Current);
yield return state;
}
}
}
そして、次のように使用します。
IEnumerable<int> seq = new List<int> { 1, 3, 12, 19, 33 };
IEnumerable<int> transformed = seq.Scan((state, item) => state + item);