Linq запрос на выбор элемента массива по достижению опереденной суммы значений предыдущих элементов

Есть массив с предстоящими платежами(например):

List<Payment> payments = new List<Payment>();
payments.Add(new Payment() { Date = "2020-01-01", Sum = 100 });
payments.Add(new Payment() { Date = "2020-02-01", Sum = 200 });
payments.Add(new Payment() { Date = "2020-03-01", Sum = 300 });
payments.Add(new Payment() { Date = "2020-04-01", Sum = 400 });
payments.Add(new Payment() { Date = "2020-05-01", Sum = 500 });

И есть сумма уже внесенных в кассу денег.

double TotalPayments = 600.00;

Как получить на выходе объект с данными следующего платежа?

var NextPayment = ?
Console.WriteLine(NextPayment.Date); // 2020-04-01
Console.WriteLine(NextPayment.Sum); // 400 

Подскажите, пожалуйста, каким образом посредством linq можно реализовать подобный выбор?

Спасибо!


Ответы (1 шт):

Автор решения: Neomaster

Нужно использовать накопитель и пропускать элементы пока он не примет определенное значение, а после того как примет – взять только следующий элемент.

int TotalPayments = 600;
int counter = 0;

var nextPayment = payments
    .SkipWhile(x =>
    {
        counter += x.Sum;
        return counter <= TotalPayments;
    })
    .Take(1)
    .First();

Console.WriteLine(nextPayment.Date); // 2020-04-01
Console.WriteLine(nextPayment.Sum); // 400
→ Ссылка