单侧去抖(Rx)

时间:2018-03-05 13:22:46

标签: reactive-programming system.reactive

我想创建一个“单侧去抖动”,其中F事件仅在n的时间跨度没有T事件时传递。关于如何解决这个问题的任何想法?

大理石图:

In:   (T)      (F)(T)   (F)       (T)     (F)(T)(F)
       |        |.....   |.....    |       |.....|.....
       |             X        |    |            X     |
Out:  (T)                    (F)  (T)                (F)

2 个答案:

答案 0 :(得分:2)

我认为这主要是有用的(假设你想保持TFTF次序)。我看不出.Sample有何帮助。这与您的解决方案非常相似:

var result = source.Publish(_source => 
        Observable.Merge(
            _source.Where(b => b),              //unthrottled trues
            _source.Throttle(ts).Where(b => !b) //throttled falses
        )
    )
    .DistinctUntilChanged();                    //To maintain TFTF order

建议使用.Publish,因为您有多个source订阅。

答案 1 :(得分:0)

我在此期间提出的是:

  1. 限制所有F项目(在Rx.Net中)
  2. 使用受限制的F作为采样器来对原始输入进行采样
  3. 将其与原始输入的T合并
  4. 使用DistinctUntilChanged删除不必要的T
  5. Marple图:

    In:         (T)      (F)(T)   (F)       (T)     (F)(T)(F)
    ThrottleF:            |......   |......          |.....|......
                               (F)       (F)                    (F)
    Sample:                    (T)       (F)                    (F)
    MergeWithT: (T)         (T)(T)       (F)(T)        (T)      (F)
    DistinctUC: (T)                      (F)(T)                 (F)
    

    C#代码:

    var result = source
                    .Sample(source
                                .Where(v => !v)
                                .Throttle(n))
                    .Merge(source
                                .Where(v => v))
                    .DistinctUntilChanged();
    

    修改 @Shlomo提供了一个改进版本,现在标记为解决方案。