(línea de código de interés es el último, el resto es sólo para una representación completa)¿Cómo podría tomar 1 artículo más de TakeWhile de Linq?
Usando el siguiente código, que quería tomar VOTANTES hasta que superó el máximo de votos necesarios, pero se detiene justo antes de alcanzar ese número máximo de votos, mi grupo de votantes tiene 1 votante menos de lo que yo quería.
¿Hay alguna manera limpia en LINQ en la que podría haberlo hecho tomar los votos HASTA que haya alcanzado el número máximo de votos? Sé que podría agregar un votante más o hacer esto en un ciclo, pero tengo curiosidad de saber si había una buena manera de hacerlo con LINQ.
var voters = new List<Person>
{
new Person("Alice", Vote.Yes),
new Person("Bob", Vote.Yes),
new Person("Catherine", Vote.No),
new Person("Denzel", Vote.Yes),
new Person("Einrich", Vote.Abstain),
new Person("Frederica", Vote.Abstain),
new Person("Goeffried", Vote.Abstain),
};
voters.Single(c => c.Name == "Alice").Voices = 100;
voters.Single(c => c.Name == "Bob").Voices = 150;
voters.Single(c => c.Name == "Catherine").Voices = 99;
voters.Single(c => c.Name == "Denzel").Voices = 24;
voters.Single(c => c.Name == "Einrich").Voices = 52;
voters.Single(c => c.Name == "Frederica").Voices = 39;
voters.Single(c => c.Name == "Goeffried").Voices = 99;
// this takes voters until we are BEFORE reaching X voices...
int voicesSoFar = 0;
int voicesNeeded = 300;
var eligibleVoters = voters.TakeWhile((p => (voicesSoFar += p.Voices) < voicesNeeded));
Nota: tenga en cuenta que 'voicesSoFar' no es correcto para el final del ciclo, sino que es una variable auxiliar. – Kobi
+1 Para una solución que no requiere escribir un método de extensión innecesario. –
Es extraño, pero no puedo obtener la primera versión para mostrar nada ... Sin embargo, el one-liner funciona perfectamente. –