(linia kodu zainteresowania jest ostatnim, reszta jest tylko dla pełnej reprezentacji)Jak mogę zabrać 1 dodatkowy przedmiot z TakeWhile Linq?
Korzystanie poniższy kod, chciałem wziąć wyborców aż przekroczyła maksymalnych głosów potrzebnych, ale zatrzymuje się tuż przed osiągnięciem tej maksymalnej liczby głosów, więc moja pula wyborców ma o 1 mniej wyborcę, niż chciałem.
Czy w LINQ istnieje czysty sposób, w jaki mógłbym zdobyć głosy, AŻ osiągnął maksymalną liczbę głosów? Wiem, że mógłbym dodać jeszcze jednego wyborcę lub zrobić to w pętli, ale jestem ciekawy, czy byłby to dobry sposób na zrobienie tego z 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));
Uwaga: należy pamiętać, że 'voicesSoFar' nie jest poprawny przed końcem pętli, jest zmienną pomocniczą. – Kobi
+1 Dla rozwiązania, które nie wymaga napisania niepotrzebnej metody rozszerzenia. –
To dziwne, ale nie mogę dostać pierwszej wersji, żeby pokazać cokolwiek ... Jedyny liniowiec działa idealnie. –