使用 RX.NET 反转 TakeUntil 逻辑

Reverse TakeUntil logic using RX.NET

首先,为了全面披露,我是 RX 的 n00b,但我现在每天都在学习......

我需要构建一个 Observable,只要另一个传入的可观察平均信号流进入某个范围内,它就会启用一个按钮(或自动开始一个动作)。据我目前所知,我可以通过添加一个 .Where 到平均 Observable 来做到这一点,然后我可以在其中检查我从事件处理程序创建的观察到的平均值是否实际上在给定范围内......

然而,我还需要的是让这些可观察值影响我的 action/button 的状态(允许它被执行)直到它的 underlying/inner 信号超出给定范围。 RX 中的这种事情是否可能作为一个反向的 .TakeUntil(inverse where 子句),我现在认为这可能会解决我的问题,或者我应该重用原始的可观察对象并用否定的 .Where 子句复制它,然后将其用作另一个独立的 observable...如果是后者,多次重复使用几乎相同的 observables 是否会造成一些性能损失,只需更改很少的 linq 查询...请问多少个 observables 太多了?

我觉得这样就够了。

var source = Observable.Range(0, 10);

var query =
    source
        .Buffer(4, 1)
        .Select(xs => xs.Average())
        .Select(x => x > 5.0 && x <= 7.0);

query.ObservableOn(button).Subscribe(enabled => button.Enabled = enabled);

(我假定 Windows 形式。)

这给了我:

False
False
False
False
True
True
False
False
False
False

我可以像这样稍微改进一下:

var query =
    source
        .Buffer(4, 1)
        .Select(xs => xs.Average())
        .Select(x => x > 5.0 && x <= 7.0)
        .StartWith(true)
        .DistinctUntilChanged();

然后给了我:

True
False
True
False

如果我遗漏了什么,请告诉我。