使用RX在不同时间触发事件?

Bra*_*non 5 c# multithreading system.reactive

我有一大堆简单的对类:

public class Pair { public DateTime Timestamp; public double Value; }
Run Code Online (Sandbox Code Playgroud)

它们按升序时间戳排序.我想在适当的时间为列表中的每个项触发一个带有Value(例如,Action <double>)的事件.时间是过去的,所以我需要规范化时间戳,使列表中的第一个是"现在".我们可以使用Reactive Extensions设置它,以便在两个项目之间的时间差异之后触发下一个事件吗?

Mat*_*lay 7

pairs是你的顺序:

var obs = pairs.OrderBy(p => p.Timestamp).ToObservable();
Run Code Online (Sandbox Code Playgroud)

现在obs将对作为有序的可观察对象.

Observable.Zip(
    obs,
    obs.Take(1).Concat(obs),
    (pair1, pair2) => Observable.Timer(pair1.Timestamp - pair2.Timestamp)
      .Select(_ => pair1.Value))
.Concat()
.Subscribe(/* Do something here */);
Run Code Online (Sandbox Code Playgroud)

拉链可以将绝对时间转换为偏移量.它将采用序列并将其与自身连接,但偏移1,如下所示

Original 1--2--4--7--11
Offset   1--1--2--4--7--11
Joined   0--1--2--3--4
Run Code Online (Sandbox Code Playgroud)

然后将这个新值放入其中Observable.Timer以使其延迟适当的量.最终Concat将结果从一个IObservable<IObservable<double>>变为平面IObservable<double>.这假定您的序列是有序的.