Ответ Стивена Свенсена великолепен, сканирование именно то, что вам нужно.Существует еще одна версия сканирования, которая не требует начального числа, что немного больше подходит для вашей конкретной проблемы.
Эта версия требует, чтобы ваш тип выходного элемента был таким же, как и тип входного элемента, которыйэто в вашем случае дает преимущество: вам не нужно передавать 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);