2015-04-12 63 views
2

我需要结合两个通常产生值的观测值。第一个序列(我们称之为Seq A)比第二个序列(Seq B)产生更多的值,但通常来自第一个可观察值的一串值在第二个值上被一个值所包围。所以基本上我需要从最新值Seq A和最新Seq B中产生一个值。有条件地结合两个时移observables

但是,可能发生第二个序列不会产生值。在这种情况下,组合序列仍然应该产生一个值;当从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:我很难很好地解释问题,所以请原谅标题。

+0

所以,更通俗地说 - 要产生一个值如果序列A没有产生足够快的故障安全,那么从序列B开始?所以A获得更高的优先级,但是如果它在超时时间内没有产生一个值,那么A的值会被选中? –

+0

@Benjamin Gruenbaum:差不多,但相反。 B有优先权,A是后备。 –

+0

只是没有足够的规范来解决这个问题:不清楚x所依赖的a和b的值是什么;目前尚不清楚在超时期内产生的后续值如何影响x。我认为你的意思是说,从a值开始超时,到期或ab元素到达a的最新值和可能的b(其中b可能不是值)被送入结果选择器产生x?在那一点,a的下一个值开始一个新的超时?如果有b并且没有a会发生什么 - b是否立即将结果输入结果选择器? –

回答

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--------- 
+0

完美,正是我所需要的。谢谢你,先生! –