取代基于另一个的Rx observable

时间:2016-08-18 08:06:41

标签: c# multithreading system.reactive

我是反应性扩展的新手,所以请原谅我的无知。我有两个可观察对象obj1obj2返回项目。在特定的时间窗口T(缓冲区,我想)我想上传最稀疏的项目序列。 参见示意图。

            Time of returned objects   
        obj1   t1  t2 t3 t4 t5 t6 ...   
        obj2  t1         t2       t3 ...
     os_obj2   t1  t1 t2 t2 t2 t3 ...   
 time_window <-----T-----><-----T----->

在上采样过程中,我们将obj2返回的项目放在obj1的项目所在的相同位置(时间)。

我们应该在特定obj2项目时间内复制obj1项目的选择取决于哪个obj2项目在特定obj1项目时间内更接近。“ p>

您能否提出一种方法(可能的功能或功能管道)来实现这一目标?

感谢。

3 个答案:

答案 0 :(得分:1)

编辑我刚注意到您要发出之前未被其他任何可观察对象发出的项目。这是无法实现的,因为它需要预见未来。

如果obj2定期发出可预测的项目,那么您可以做一些事情。让obj2提前半周发出这些项目,这样您就可以使用obj2中的最新项目,而无需预测将来的项目。

以下示例将以obj2的发射时间从obj1发出最新项目。最简单的方法是使用Observable.withLatestFrom

var obj1 = Rx.Observable.interval(500).map(x => "obj1." + x).take(10);
var obj2 = Rx.Observable.interval(300).map(x => "obj2." + x).take(10);

obj2.withLatestFrom(obj1).pluck(1).subscribe(x => console.log(x));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.0-beta.11/Rx.umd.js"></script>

PS:起初我以为sample可以使用,但它对我来说不适用于过采样。

答案 1 :(得分:1)

可观察流中的每个值都有两个元素:它出现的时间和值。所以让我们稍微改变你的原理图:

Timeline  0--1--2--3--4--5--6--7--8...
XObserve  x0-x1-x2-x3-x4-x5-x6-x7-x8...
YObserve  y0-------y1-------y2------...

所以我们有两个observable,一个每秒发出一个值(为简单起见,我们说时间轴是第二个刻度),另一个每三秒发出一个值。鉴于这一点,您是否希望第三个流ZObserve使用上采样技术以X流的速率生成Y流的值,如此?

Timeline  0--1--2--3--4--5--6--7--8-...
XObserve  x0-x1-x2-x3-x4-x5-x6-x7-x8...
YObserve  y0-------y1-------y2------...
ZObserve  y0-y0-y1-y1-y1-y2-y2-y2-??...

正如您所见,ZObserve T8的值为??,因为我不知道它是什么。我也不知道在T2T5我怎么能预测到Y流的下一个值是什么。如果有可靠的规则,那么我们可以相应地对其进行编码,生成新的流PredictedY,并使用WithLatestFrom作为@Tamas建议生成Z流。

答案 2 :(得分:0)

我建议使用Operator CombineLatest,然后使用Sample