У вас очень неприятная проблема, возникающая из-за изменения внешней переменной в лямбда-выражении. Проблема заключается в следующем: если вы попытаетесь выполнить итерацию eligibleVoters
дважды (foreach(var voter in eligibleVoters) { Console.WriteLine(voter.Name); }
и сразу после (foreach(var voter in eligibleVoters) { Console.WriteLine(voter.Name); }
)), вы не увидите тот же вывод. Это просто неправильно с точки зрения функционального программирования.
Вот метод расширения, который будет накапливаться до тех пор, пока какое-либо условие на аккумуляторе не станет истинным:
public static IEnumerable<T> TakeWhileAccumulator<T, TAccumulate>(
this IEnumerable<T> elements,
TAccumulate seed,
Func<TAccumulate, T, TAccumulate> accumulator,
Func<TAccumulate, bool> predicate
) {
TAccumulate accumulate = seed;
foreach(T element in elements) {
if(!predicate(accumulate)) {
yield break;
}
accumulate = accumulator(accumulate, element);
yield return element;
}
}
Использование:
var eligibleVoters = voters.TakeWhileAccumulator(
0,
(votes, p) => votes + p.Voices,
i => i < 300
);
Таким образом, вышесказанное говорит, что набирайте голоса, а мы набрали менее 300 голосов.
Затем с:
foreach (var item in eligibleVoters) { Console.WriteLine(item.Name); }
Console.WriteLine();
foreach (var item in eligibleVoters) { Console.WriteLine(item.Name); }
Вывод:
Alice
Bob
Catherine
Alice
Bob
Catherine