3

以下のシナリオを実行するための Rx の拡張メソッドはありますか?

値の間

ポンピングを開始する値 (緑色の円) と、ポンピングを停止する値 (葦の円) があります。青い円は期待される値である必要があります。このコマンドがキャンセルされて再作成されることは望ましくありません (つまり、"TakeUntil" と「SkipUntil」は機能しません)。

LINQ を使用した実装は次のようになります。

  public static IEnumerable<T> TakeBetween<T>(this IEnumerable<T> source, Func<T, bool> entry, Func<T, bool> exit)
    {
        bool yield = false;
        foreach (var item in source)
        {
            if (!yield)
            {
                if (!entry(item)) 
                    continue;

                yield = true;
                continue;
            }

            if (exit(item))
            {
                yield = false;
                continue;
            }

            yield return item;
        }
    }

これと同じロジックをどのように使用できIObservable<T>ますか?

4

2 に答える 2

3

拡張メソッドとして必要なものは次のとおりです。

public static IObservable<T> TakeBetween<T>(
    this IObservable<T> source,
    Func<T, bool> entry,
    Func<T, bool> exit)
{
    return source
        .Publish(xs =>
        {
            var entries = xs.Where(entry);
            var exits = xs.Where(exit);
            return xs.Window(entries, x => exits);
        })
        .Switch();
}

これに含めた重要なことは、Publish拡張機能の使用です。この特定のケースでは、ソースオブザーバブルが「ホット」である可能性があり、これにより、ソースへの複数のサブスクリプションを作成せずにソース値を共有できるため、重要です。

于 2013-09-16T05:23:15.367 に答える
3

Windowを使用できると思います:

source.Window(entrySignal, _ => exitSignal).Switch();
于 2013-09-13T20:02:41.063 に答える