首先,要完全披露我在RX中的n00b,但我现在每天都在学习......
我需要构建一个Observable,只要另一个传入的可观察平均信号流在一定范围内进入,它就会启用一个按钮(或自动启动一个动作)。至于我到目前为止所学到的,我可以通过在平均的Observable中添加一个.Where,然后我可以检查我从事件处理程序创建的观察到的平均值实际上是在给定范围内。
然而,我还需要让这些可观察值影响我的动作/按钮的状态(允许它被执行)直到其底层/内部信号超出给定范围。在RX中这样的事情可能作为一个反转的.TakeUntil(反向where子句),我现在认为它可以解决我的问题,或者我应该重用原始的observable并用一个否定的.Where子句复制它然后再用它作为另一个独立可观察...如果是后者,通过多次重复使用几乎相同的可观察量会有一些性能损失,只需改变它们的linq查询...有多少可观察量太多了?
答案 0 :(得分:3)
在我看来,这样的事情就足够了。
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
如果我错过任何事情,请告诉我。