【问题标题】:How to deal with overlapping streams for reactive extensions?如何处理响应式扩展的重叠流?
【发布时间】:2018-06-05 15:13:36
【问题描述】:

假设我有一系列这样的:

X - X - A - B - C - X - X

我对两个事件感兴趣:

1-) 如果A - B - C 顺序出现。

2-) 如果B - C 顺序出现并且如果A - B - C 没有出现。

因此我会订阅。

例如,如果出现A - B - C,我将只打印ABC,而不打印BC,而如果出现X - B - C,我将打印BC。我该怎么做?

【问题讨论】:

    标签: system.reactive reactive-programming reactive


    【解决方案1】:

    如果您的来源是IObservable<char>,那么试试这些:

    IObservable<string> query1 =
        source
            .Publish(ss =>
                ss
                    .Zip(ss.Skip(1), (s0, s1) => new { s0, s1 })
                    .Zip(ss.Skip(2), (s01, s2) => new { s01.s0, s01.s1, s2 }))
            .Where(s => s.s0 == 'A' && s.s1 == 'B' & s.s2 == 'C')
            .Select(s => String.Join("", s.s0, s.s1, s.s2));
    
    IObservable<string> query2 =
        source
            .Publish(ss =>
                ss
                    .Zip(ss.Skip(1), (s0, s1) => new { s0, s1 })
                    .Zip(ss.Skip(2), (s01, s2) => new { s01.s0, s01.s1, s2 }))
            .Where(s => s.s0 != 'A' && s.s1 == 'B' & s.s2 == 'C')
            .Select(s => String.Join("", s.s1, s.s2));  
    

    【讨论】:

    • 很好,但如果没有非条件 s0 != 'A' 可以做到吗?因为我希望这些查询彼此独立?
    • @OnurGumus - 我不确定您所说的“彼此独立”是什么意思?
    • 假设 query2 不知道查询 1 是否使用 A。它可以是任何字母。因此,我尝试基于 query1 编写 query2 作为参考,而 query2 不知道 query1 的内部结构。换句话说,如果查询 1 以某种方式开始使用 Z 而不是 A,则查询 2 的代码不应更改。
    • @OnurGumus - 我的 query1query2 已经相互独立了。
    • 是的,但 query2 知道“A”并使用非条件。如果我们查看 query2 的定义,没有提到 A。如果仅查询 1 失败,它应该可以工作。
    猜你喜欢
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多