如何用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
相关产品推荐
相关产品推荐

