我有一個IObservable<bool>
,我希望在最後一個n
項目設置爲true時得到通知。訂閱布爾狀態使用Rx
對於像我想要的東西:
MyBool.Buffer(10).SelectMany(x => x).All(x => x).Subscribe(x => /*do something*/);
但它只能觸發一次;似乎OnCompleted
被解僱了。
我有一個IObservable<bool>
,我希望在最後一個n
項目設置爲true時得到通知。訂閱布爾狀態使用Rx
對於像我想要的東西:
MyBool.Buffer(10).SelectMany(x => x).All(x => x).Subscribe(x => /*do something*/);
但它只能觸發一次;似乎OnCompleted
被解僱了。
您正在有效地緩衝和展平您的可觀察值。調用.Buffer(10).SelectMany(x => x)
就像是一種非手術,因爲它發出的什麼都去
你需要做的是更多這樣的:
MyBool
.Buffer(10, 1)
.Select(xs => xs.All(x => x))
.Where(x => x);
我假設你想知道,每當有10個trues在排,如果有11個,你會得到兩次通知。
背後Buffer(10, 1)
的原因是這樣Buffer
作品 - 這給10
元素的緩衝區,並沿着1
移動。如果我做了Buffer(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]);
這給了這些可能的組合:
這實際工作,請你解釋一下在緩衝區中跳過'1'有什麼意義? – Sturm
我現在正努力實現通知,當連續10個trues後MyBool設置爲false時。我是否需要另一個IObservable並與當前的(MyBool')結合? – Sturm
@Sturm - 我添加了更多細節。 – Enigmativity