Создайте список значений на основе начального значения и предыдущего значения

У меня есть объект (триггер), который содержит метод GetNextFireTime(DateTimeOffset after), который возвращает значение в следующий раз, когда триггер сработает после данного ввода. Моя цель состоит в том, чтобы, учитывая ввод списка времен неизвестного размера n, а также времени начала, гарантировать, что список времен соответствует первым n раз, когда триггер сработает после времени запуска. Это довольно легко сделать вот так

void Test(ITrigger trigger, DateTimeOffset start, DateTimeOffset[] expectedFireTimes){
  var nextFire = startTime;
  foreach (var expectedFire in expectedFireTimes){
    nextFire = trigger.GetFireTimeAfter(nextFire);
    Assert.That(nextFire, Is.EqualTo(expectedFire));
  }
}

Однако затем я решил, что предпочитаю рассматривать результаты испытаний как одно утверждение, а не утверждать элементы один за другим, так что, если первые два времени срабатывания верны, а третье неверно, результаты испытаний ясно показывают, что было сделано. ожидалось и что было обнаружено. Это можно сделать, создав список, а не утверждая в цикле:

void Test(ITrigger trigger, DateTimeOffset start, DateTimeOffset[] expectedFireTimes){
  var nextFire = startTime;
  var upcomingFireTimes = new List<DateTimeOffset>();
  foreach (var expectedFire in expectedFireTimes){
    nextFire = trigger.GetFireTimeAfter(nextFire);
    upcomingFireTimes.Add(nextFire);
  }
  Assert.That(upcomingFireTimes, Is.EqualTo(expectedFireTimes));
}

Это тоже работает, но заставило меня задуматься о том, можно ли это сделать через Linq. Есть ли в Linq метод создания списка, в котором каждый элемент рассчитывается на основе начального начального числа и предыдущего элемента? Самое близкое, что я могу придумать, это Aggregate(), который принимает начальное значение и функцию, но возвращает только одно значение, и мне пришлось бы хранить отдельные элементы в списке внутри функции, что делает его очень похожим на цикл foreach выше. :

var upcomingFireTimes = new List<DateTimeOffset>();
expectedFireTimes.Aggregate(
  startTime,
  (seed, _) => {
    var nextfire = trigger.GetFireTimeAfter(seed);
    upcomingFireTimes.Add(nextFire);
    return nextFire;
  });

Моя цель — однострочный метод Linq, который вместо того, чтобы в конечном итоге возвращать только последнее вычисленное значение, как это делает Aggregate(), возвращает все значения, вычисленные по пути, например:

var upcomingFireTimes = expectedFireTimes.SomeLinqMethod(
  startTime,
  (seed, _) => trigger.GetFireTimeAfter(seed));
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш метод Linq — Select!

DateTime firetime = startTime;
var upcomingFireTimes = expectedFireTimes.Select(s => { return fireTime = trigger.GetFireTimeAfter(fireTime) } );

Вы можете генерировать все, что вам нужно, используя или не используя исходную коллекцию.

Это не вызывает метод GetFireTimeAfter. Рассматриваемые триггеры могут срабатывать не через равные промежутки времени, поэтому мы не можем каждый раз просто увеличивать фиксированное количество минут.

ewok 21.08.2024 20:52

Вы можете звонить куда угодно. Посмотрите выше.

rotabor 21.08.2024 21:01

Другие вопросы по теме