c# - 有条件地组合两个时移观测值

标签 c# system.reactive

我需要组合两个通常一个接一个产生值的可观察值。第一个序列(我们称它为 Seq A)比第二个序列(Seq B)产生更多的值,但通常第一个可观察值的一堆值后面跟着一个值在第二个。所以基本上我需要根据 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:我很难把问题解释清楚,所以请原谅这个标题。

最佳答案

我会尝试一下。给定 observables 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---------

关于c# - 有条件地组合两个时移观测值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29591130/

相关文章:

c# - 如何在xml中添加属性值

c# - 使用 wpf 发送电子邮件

system.reactive - 如何使用具有更多属性的 WhenAnyValue

.net - .NET Rx 相对于经典事件的优势?

c# - 为什么 C# Rx Subscribe() 函数不适用于 "async"关键字?

.net - 是否有一个响应式框架主题可以缓冲直到不需要为止?

c# - 将转换器指定为 MarkupExtension 时在设计时出现 InvalidCastException

c# - .net 检查用户是否登录 signalR

c# - 在c#中构建链表

.net - System.Reactive 5.0 中缺少 DispatcherScheduler