2017-12-13 5 views
0

ある時はいつでも観察可能でください、私は次の意味を持つのRxオペレータを探しています:Rxのオペレータ:その他の観察からの最新の値がtrue

Observable<int> inputValues = …; 
Observable<bool> gate = …; 

inputValues 
    .combineLatest(gate) 
    .filter((pair<int, bool> pair) -> { return pair.second; }) 
    .map((pair<int, bool> pair) -> { return pair.first; }); 

から最新値ながら、それは最初の観察可能から値を発します2番目の観測可能な値はtrueです。 combineLatestを使用すると、2番目のObservable trueになったときに値が取得されます。それが望ましくない場合はcombineLatestの代わりにwithLatestFromを使用できます。

この演算子は(どのRx実装でも)存在しますか?

答えて

2

私はC#コードを教えてくれて申し訳ありませんが、ここに書かれています。うまくいけば誰かが私のために翻訳することができます。

.Switch演算子を使用してください。外部観測値によって返された最新の観測値によって生成された値のみを返すことによってIObservable<IObservable<T>>IObservable<T>に変換します。

var _gate = new Subject<bool>(); 
var _inputValues = new Subject<int>(); 

IObservable<int> inputValues = _inputValues; 
IObservable<bool> gate = _gate; 

IObservable<int> query = 
    gate 
     .StartWith(true) 
     .Select(g => g ? inputValues : Observable.Never<int>()) 
     .Switch(); 

query 
    .Subscribe(v => Console.WriteLine(v)); 

_inputValues.OnNext(1); 
_inputValues.OnNext(2); 
_inputValues.OnNext(3); 
_gate.OnNext(false); 
_inputValues.OnNext(4); 
_inputValues.OnNext(5); 
_gate.OnNext(true); 
_inputValues.OnNext(6); 

これが生成します。

 
1 
2 
3 
6 

inputValuesReplaySubjectであれば、あなたは正しくクエリを動作させるためにこれを行うことができます:

IObservable<int> query = 
    inputValues 
     .Publish(i => 
      gate 
       .StartWith(true) 
       .Select(g => g ? i : Observable.Never<int>()) 
       .Switch()); 
+0

私はそれを感謝!そして、翻訳する必要はありません;)私たちのソリューションは、 'inputValues'がリプレイの主題である場合、異なる動作をします。 'gate'が' true'になるたびに、あなたのバージョンは 'inputValues'から以前の値を再生します。私が購読すると、その時点で 'gate'が' true'であるときだけ、私はそれらを再生します。あれは正しいですか? – basteln

+0

@basteln - '.Publish'を付けると、その動作を防ぐことができます。私はそれをあなたに見せてくれるでしょう。 – Enigmativity

+1

すごい!それでは、全体の行動をカバーする演算子がないのでしょうか?この実装を使用して作成します。 – basteln

関連する問題