You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Linq实现基于种子与前值生成ITrigger触发时间序列?

用LINQ风格生成触发器触发时间序列的方案

Linq本身没有内置的“从初始种子开始,基于前一个元素生成完整序列”的方法,但你可以通过自定义扩展方法实现一行调用的效果,完全匹配你的需求。

自定义扩展方法实现

public static IEnumerable<T> GenerateSequence<T>(T seed, Func<T, T> nextElementGenerator, int count)
{
    var current = seed;
    for (int i = 0; i < count; i++)
    {
        yield return current;
        current = nextElementGenerator(current);
    }
}

针对你的场景调用

假设你有ITrigger trigger实例、起始时间DateTimeOffset start,以及需要生成的触发次数n,可以这样一行生成序列:

var actualFireTimes = GenerateSequence(start, time => trigger.GetNextFireTime(time).Value, n);

注意:如果GetNextFireTime可能返回null,建议添加空值判断逻辑,避免空引用异常。

方案优势

  • 采用延迟执行的迭代器模式,和Linq原生方法行为一致
  • 调用代码简洁直观,完全符合你“一行生成完整序列”的诉求
  • 生成序列后可直接与预期列表做断言(如Assert.Equal(expectedTimes, actualFireTimes)),测试结果对比清晰

替代方案(不推荐)

如果不想自定义扩展,也可以用Enumerable.Range配合Aggregate实现,但代码可读性差且非延迟执行:

var actualFireTimes = Enumerable.Range(0, n)
    .Aggregate(
        new List<DateTimeOffset> { start },
        (list, _) => 
        {
            var next = trigger.GetNextFireTime(list.Last()).Value;
            list.Add(next);
            return list;
        });

内容的提问来源于stack exchange,提问作者ewok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 06:16:08