Мне кажется, что вам нужен метод Accumulate
, который выдает новую последовательность накопленных значений вместо скаляра. Как то так:
public static IEnumerable<TAccumulate> SequenceAggregate<TSource, TAccumulate>(
this IEnumerable<TSource> source,
TAccumulate seed,
Func<TAccumulate, TSource, TAccumulate> func)
{
TAccumulate current = seed;
foreach (TSource item in source)
{
current = func(current, item);
yield return current;
}
}
Тогда вы можете подать заявку TakeWhile
:
int[] amountWithdrawal = { 10, 20, 30, 140, 50, 70 };
var query = amountWithdrawal.SequenceAggregate(100, (balance, withdrawal) =>
{
Console.WriteLine("balance :{0},Withdrawal:{1}", balance, withdrawal);
return balance - withdrawal;
}).TakeWhile (balance => balance >= 0);
Я мог бы поклясться, что что-то подобное было в обычном LINQ to Objects, но я не могу найти это в данный момент ...