有条件地组合两个时移的可观测量

时间:2015-04-12 15:27:56

标签: c# system.reactive

我需要组合两个通常会一个接一个地产生值的observable。第一个序列(让我们称之为Seq A)产生的值多于第二个(Seq B),但通常第一个observable中的一堆值在第二个序列上被一个值所包含。所以基本上我需要从Seq A的最新值和最新的Seq B生成一个值。

但是,可能会发生第二个序列不产生值。在这种情况下,组合序列仍应产生一个值;在SeqA之后的值和某些超时Seq B仍然没有产生值时,我需要从Seq A生成一个值。

大理石图应如下所示:

                          <-> Timeout          No timeout
Seq A  | a1-----------a2a3---------------a4a5-a6---------
Seq B  | --b1----------------------------------b3--------
Output | ---x1--------------x2------------------x3-------
                            ^ - I need this      ^ - And this

其中Output基本上是值的某种组合。

PS:我很难明确地解释这个问题,所以请原谅标题。

1 个答案:

答案 0 :(得分:1)

我会抓住这个。鉴于可观察量AB,我认为这样做可以解决问题:

// 1500 millisecond timeout to be used on observable B.
TimeSpan timeout = TimeSpan.FromMilliseconds(1500);

var result =
    A
    .Select(a => 
        B
        .Timeout(timeout)
        .Materialize()
        .Take(1)
        .Select(b => b.Kind == NotificationKind.OnNext ? b.Value : a))
    .Switch();

这个大理石图应该如下所示:

                                               <-1500ms->Timeout
SeqA   |--------a0--------------a1-a2--------a3---------------------
SeqB   |b0--------b1----b2-----------b3-----------------------------
Output |----------b1-----------------b3------------------a3---------