1

Switchなどの拡張機能を探していますが、デフォルトで最新のストリームを使用する代わりに、別の外部イベントに基づいて前後に移動できる追加の変数を備えたスイッチが必要です。

例えば。2つのストリームのマージであるobservableがありABイベントCが検出されたときに、observableAを通過させ、からのストリームをB無視(失われる)します。イベントが検出されたら、監視可能なストリームをドロップして通過させDたいです。AB

これに最適なlinq演算子は何ですか?whereといくつかのカスタムソリューションを組み合わせて使用​​できると思いますが、実際にはもっとエレガントなソリューションを探しています。

また、可能な限りストリームからのサブスクライブ/再サブスクライブは避けたいと思います。サブスクライブ/再サブスクライブは、一般的に追跡するのが非常に難しく、さらにオペレーターを連鎖させるのも難しいと思います。

4

1 に答える 1

3

これに取り組む方法はたくさんあります。簡単な方法を見てみましょう。この例では、イベントABは同じタイプであると想定しています。Cまた、イベント(に関連付けられているA)およびD(に関連付けられてDいる)も、重要な情報がなくても観察可能であると想定しています。

var streamA = new Subject<string>();
var streamB = new Subject<string>();

var switchToA = new Subject<Unit>();
var switchToB = new Subject<Unit>();

ここで、火災が発生するstreamAたびにウィンドウを開き、switchToA火災が発生するとウィンドウを閉じswitchToBます。反対の操作を行ってstreamBから、それらをマージします。

public IObservable<string> SwitchingWindows(IObservable<string> streamA, IObservable<string> streamB, IObservable<Unit> switchToA, IObservable<Unit> switchToB)
{                                       
    var switchedA = streamA.Window(switchToA, _ => switchToB).Concat();
    var switchedB = streamB.Window(switchToB, _ => switchToA).Concat();

    return switchedA.Merge(switchedB);
}

申し込む:

    var all = SwitchingWindows(streamA, streamB, switchToA, switchToB);
    all.Subscribe(x => Console.WriteLine(x));

テスト:

streamA.OnNext("a1");           // skip
switchToA.OnNext(Unit.Default); // switch A
streamA.OnNext("a2");           // shown
streamB.OnNext("b1");           // skip
streamA.OnNext("a3");           // shown
switchToB.OnNext(Unit.Default); // switch B
streamB.OnNext("b2");           // shown
streamB.OnNext("b3");           // shown
streamA.OnNext("a4");           // skip
switchToA.OnNext(Unit.Default); // switch A
streamA.OnNext("a5");           // shown
streamB.OnNext("b4");           // skip
streamB.OnNext("b5");           // skip
switchToB.OnNext(Unit.Default); // switch B
streamB.OnNext("b6");           // shown
streamA.OnNext("a6");           // skip

出力は期待どおりです:

a2
a3
b2
b3
a5
b6

最終的なストリームallは100%クリーンです。

于 2012-05-02T00:32:50.240 に答える