如何处理反应性扩展的重叠流?

时间:2017-12-23 06:47:41

标签: system.reactive reactive-programming reactive

假设我有一系列这样的:

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 即可。我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

如果您的来源为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));