使用Rx订阅bool状态

时间:2017-02-27 23:19:06

标签: c# system.reactive

我有一个IObservable<bool>,我希望在最后n项设置为true时收到通知。

为此,我正在尝试这样的事情:

MyBool.Buffer(10).SelectMany(x => x).All(x => x).Subscribe(x => /*do something*/);

但它只发射一次;似乎OnCompleted以某种方式被解雇了。

1 个答案:

答案 0 :(得分:3)

你有效地缓冲和压扁你的观察力。调用.Buffer(10).SelectMany(x => x)就像是一个非操作,因为它发出了所有内容。

你需要做的更像是这样:

    MyBool
        .Buffer(10, 1)
        .Select(xs => xs.All(x => x))
        .Where(x => x);

我假设你想知道连续10个真相,所以如果有11个,你会被告知两次。

Buffer(10, 1)背后的原因是Buffer的工作方式 - 这会提供10元素的缓冲区,并按1移动。如果我做Buffer(10),我会得到10个元素,然后移动10个。

如果我Observable.Range(0, 5).Buffer(3) {0, 1, 2}, {3, 4}我得到Observable.Range(0, 5).Buffer(3, 1),但如果我{0, 1, 2}, {1, 2, 3}, {2, 3, 4}, {3, 4}, {4}我得到false

如果您想知道trues之后MyBool .Buffer(3, 1) .Select(xs => xs.All(x => x)) .Buffer(2, 1) .Where(x => x[0] || x[1]); 何时到达,请尝试以下操作:

GloablaRNG

这给出了这些可能的组合:

results