可以从时间表列表中观察到

如果我有一个包含时间戳的对象列表 – 如何在时间戳之间的相对时间生成一个可观察到的事件?

例如。 如果我有三个带有时间戳的对象2014-01-01 10:30,2014-01-01 10:45和2014-01-01 11:30,我希望第一个事件立刻开始,接下来的15分钟后,最后一个45分钟后。

我怎样才能加快这个过程,1分钟等于1秒? 因此,第一个事件将像以前一样立即开始,但下一个事件将在15秒后而不是15分钟之后开始,依此类推。

有很多方法可以做到这一点我很确定,但是这里有一个使用Observable.Generate来快速安排特定时间事件的示例。 它使用事件列表 – 但是如果它与迭代器一起使用,您可以轻松地使其适应另一个源:

void Main() { var now = DateTime.Now; var events = new List> { Tuple.Create(now.AddSeconds(5), "A"), Tuple.Create(now.AddSeconds(10), "B"), Tuple.Create(now.AddSeconds(15), "C") }; var eventSource = Observable.Generate( (IEnumerator>)events.GetEnumerator(), s => s.MoveNext(), s => s, s => s.Current.Item2, // the data s => s.Current.Item1); // the timing eventSource.Subscribe(Console.WriteLine); } 

这写出“A”,“B”和“C”以及启动后5,10和15秒。

为了加快时间,您可以围绕如何解释预定时间。 它使用HistoricalScheduler另一种方式。 有关这方面的一些见解,请参阅此答案 。

最简单的方法是合并一个可枚举的可观察对象

 IEnumerable> timeStamps = ...; IObservable> eventStamps = timeStamps .Select(s => Observable.Timer(s.Item1).Select(e=>s)) .Merge(); 

根据James World的回答,为了加快或减慢时间,您可以将历史调度程序添加为Timer的第二个参数。 (给他点那个点。在我读他的答案之前,我不知道这一点)

 Observable.Timer(s.Item1, historicalScheduler) 

如果您想知道为什么DateTimeOffset而不是DateTime查看DateTime与DateTimeOffset

好的是,如果timeStamps是IEnumerableIObservable上面的代码可以工作。 合并的重载适用于任何一种。