(line of code of interest is the last one, the rest is just for a full representation)
Using the following code, I wanted to take VOTERS until I exceeded
Just write your own extension method:
static class IEnumerableExtensions {
public static IEnumerable TakeUntil(
this IEnumerable elements,
Func predicate
) {
return elements.Select((x, i) => new { Item = x, Index = i })
.TakeUntil((x, i) => predicate(x.Item))
.Select(x => x.Item);
}
public static IEnumerable TakeUntil(
this IEnumerable elements,
Func predicate
) {
int i = 0;
foreach (T element in elements) {
if (predicate(element, i)) {
yield return element;
yield break;
}
yield return element;
i++;
}
}
}
Usage:
var eligibleVoters = voters.TakeUntil(
p => (voicesSoFar += p.Voices) >= voicesNeeded
);
foreach(var voter in eligibleVoters) {
Console.WriteLine(voter.Name);
}
Output:
Alice
Bob
Catherine