ストリームのカスタマイズ可能なフィルタリング

zpul

ストリームにフィルターのリストを構成する必要があります。

ストリームには最初はフィルターがありませんが、時間の経過とともにアクティブなフィルターのリストが表示されます。

各フィルターには厳密な有効期間があります。

テストケースは次のとおりです。

var scheduler = new TestScheduler();

var input = scheduler.CreateColdObservable<char>(
    ReactiveTest.OnNext(0100.Ms(), '1'),
    ReactiveTest.OnNext(0200.Ms(), 'A'),
    ReactiveTest.OnNext(0300.Ms(), '2'),
    ReactiveTest.OnNext(0400.Ms(), 'B'),
    ReactiveTest.OnNext(0500.Ms(), 'A'),
    ReactiveTest.OnNext(0600.Ms(), 'B'),
    ReactiveTest.OnNext(0700.Ms(), '5'),
    ReactiveTest.OnNext(0800.Ms(), 'A'),
    ReactiveTest.OnNext(0900.Ms(), 'C') );

// filters
// A between 70ms -> 550ms
// B between 330ms -> 400ms 
// modeled as a string observable where:
// first word is the char to filter
// second word are the msecs duration of the filter

var filters = scheduler.CreateColdObservable<string>(
    ReactiveTest.OnNext(0070.Ms(), "A 480"),
    ReactiveTest.OnNext(0330.Ms(), "B 70")
);

var expected = scheduler.CreateColdObservable<char>(
    ReactiveTest.OnNext(0100.Ms(), '1'),
    ReactiveTest.OnNext(0300.Ms(), '2'),
    ReactiveTest.OnNext(0600.Ms(), 'B'),
    ReactiveTest.OnNext(0700.Ms(), '5'),
    ReactiveTest.OnNext(0800.Ms(), 'A'),
    ReactiveTest.OnNext(0900.Ms(), 'C') );

これを行うのに最適なRxソリューションを提案できますか?

ps:私は次の拡張メソッドを使用しています

public static class TickExtensions
{
    public static long Ms(this int ms)
    {
        return TimeSpan.FromMilliseconds(ms).Ticks;
    }
}
シュロモ

まず、入力は次のようになります。

var input = scheduler.CreateColdObservable<char>(
    ReactiveTest.OnNext(0100.Ms(), '1'),
    ReactiveTest.OnNext(0200.Ms(), 'A'),
    ReactiveTest.OnNext(0300.Ms(), '2'),
    ReactiveTest.OnNext(0400.Ms(), 'B'), //You forgot this line
    ReactiveTest.OnNext(0500.Ms(), 'A'),
    ReactiveTest.OnNext(0600.Ms(), 'B'),
    ReactiveTest.OnNext(0700.Ms(), '5'),
    ReactiveTest.OnNext(0800.Ms(), 'A'),
    ReactiveTest.OnNext(0900.Ms(), 'C'));

また、@ LeeCampbellが述べたように、Ms拡張メソッドはタイプlongではなくタイプを返す必要がありTimeSpanます。

これが私が思いついた解決策です:

 var activeFilters = filters
    .Select(s => s.Split(' '))
    .Select(s => Tuple.Create(s[0][0], TimeSpan.FromMilliseconds(int.Parse(s[1]))))
    .Select(t => Observable.Timer(t.Item2, scheduler).Select(_ => t.Item1).StartWith(t.Item1))
    .MergeCombineLatest(true)
    .StartWith(new List<char>());

var output = activeFilters.Publish(_activeFilters => 
        input.Join(_activeFilters,
            _ => Observable.Return(1),
            t => _activeFilters,
            (c, filterList) => Tuple.Create(c, filterList)
        )
    )
    .Where(t => !t.Item2.Contains(t.Item1))
    .Select(t => t.Item1);

var observer = scheduler.CreateObserver<char>();
output.Subscribe(observer);
scheduler.Start();

ReactiveAssert.AreElementsEqual(
    expected.Messages,
    observer.Messages);

activeFilters現在フィルタリング中の文字のリストを発行するオブザーバブルです。アクティブにフィルタリングされたリストが変更されるとactiveFilters、新しいリストが発行されます同じ文字に複数のフィルターを含めることができるため、リストは必ずしも一意ではないことに注意してください。

どのフィルターがアクティブであるかをいつでも把握できたら、そのリストを入力に結合できます。

コードには、System.Collections.ImmutableNugetパッケージを使用する次の拡張メソッドが必要です。

public static IObservable<IList<T>> MergeCombineLatest<T>(this IObservable<IObservable<T>> outer, bool removeCompleted)
{
    return outer
        .SelectMany((inner, i) => inner
            .Materialize()
            .SelectMany(nt => nt.Kind == NotificationKind.OnNext
                ? Observable.Return(Tuple.Create(i, nt.Value, true))
                : nt.Kind == NotificationKind.OnCompleted
                    ? removeCompleted
                        ? Observable.Return(Tuple.Create(i, default(T), false))
                        : Observable.Empty<Tuple<int, T, bool>>()
                    : Observable.Throw<Tuple<int, T, bool>>(nt.Exception)
            )
        )
        .Scan(ImmutableDictionary<int, T>.Empty, (dict, t) => t.Item3 ? dict.SetItem(t.Item1, t.Item2) : dict.Remove(t.Item1))
        .Select(dict => dict.Values.ToList());
}

MergeCombineLatestオブザーバブルのオブザーバブルを取得し、各子オブザーバブルから最新の値のリストを発行します。場合はremoveCompletedtrueで、そのとき子供に観察が完了すると、リストは1収縮します。removeCompletedfalseの場合、最後の値はリストと後続のリストに永久に残ります。

これを行うためのより友好的な方法があれば、私は多くの義務を負います。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Androidのカスタマイズ可能なフローティングボタン

分類Dev

各JSONオブジェクトをフィルタリングしてカスタマイズ可能なReactテーブルを作成する

分類Dev

リーフレットルーティングエラーのカスタマイズ(オプション)

分類Dev

Spark:共起のカウント-膨大なコレクションの効率的なマルチパスフィルタリングのアルゴリズム

分類Dev

RallyカスタムHTML-マイルストーンでフィルタリング

分類Dev

検索ビューを使用したカスタムリストアイテムのフィルタリング

分類Dev

KendoMVCグリッドフィルターのカスタマイズが機能しない

分類Dev

グーグルチャートでカテゴリフィルターをカスタマイズする方法

分類Dev

プレゼンター向けにファクトリーガールのリンティングをカスタマイズする

分類Dev

DTO内のマッピングリクエストパラメータとフィールドをカスタマイズしますか?

分類Dev

リストアイテムとマーカーをフィルタリング/検索する方法

分類Dev

サービススタックのリクエストライフサイクルとルーティングメカニズムを理解する

分類Dev

グラフィカルなタイムスケジュールのHTMLテーブルまたはリスト

分類Dev

シャイニー/リーフレット/ Rのズームレベルによるマーカークラスタリングの変更

分類Dev

高度なカスタムフィールド、Wordpressでフィルタリング

分類Dev

コンテストごとのカスタマイズを可能にする賞品テーブルのデータベースモデリング

分類Dev

検索可能なフィールドのModelAdminカスタマイズ

分類Dev

KERASモデルのトレーニング可能なパラメーターをカスタマイズする

分類Dev

特定の列の可能なプレフィックスのリストでデータフレームをフィルタリングする

分類Dev

カスタムDjangoカウントフィルタリング

分類Dev

MATLABでの非常にノイズの多い/スパイキーな位置データのフィルタリング(またはアルゴリズムの作成?)

分類Dev

マーカーサイズ/アルファスケーリングとウィンドウサイズ/プロット/散布図のズーム

分類Dev

マーカーサイズ/アルファスケーリングとウィンドウサイズ/プロット/散布図のズーム

分類Dev

QBFC:カスタムレポート-カスタムフィールドでフィルタリング

分類Dev

ムービーリストJavaScriptのフィルタリング

分類Dev

協調フィルタリング用のユーザーアイテムマトリックスの作成

分類Dev

Django:ユーザーモデルのリターンフィールドをカスタマイズする

分類Dev

アーキテクチャ:マングースを使用した時間フィルタリング可能なリーダーボードシステムの作成

分類Dev

ヘクスのスターパスファインディングアルゴリズムのバグ

Related 関連記事

  1. 1

    Androidのカスタマイズ可能なフローティングボタン

  2. 2

    各JSONオブジェクトをフィルタリングしてカスタマイズ可能なReactテーブルを作成する

  3. 3

    リーフレットルーティングエラーのカスタマイズ(オプション)

  4. 4

    Spark:共起のカウント-膨大なコレクションの効率的なマルチパスフィルタリングのアルゴリズム

  5. 5

    RallyカスタムHTML-マイルストーンでフィルタリング

  6. 6

    検索ビューを使用したカスタムリストアイテムのフィルタリング

  7. 7

    KendoMVCグリッドフィルターのカスタマイズが機能しない

  8. 8

    グーグルチャートでカテゴリフィルターをカスタマイズする方法

  9. 9

    プレゼンター向けにファクトリーガールのリンティングをカスタマイズする

  10. 10

    DTO内のマッピングリクエストパラメータとフィールドをカスタマイズしますか?

  11. 11

    リストアイテムとマーカーをフィルタリング/検索する方法

  12. 12

    サービススタックのリクエストライフサイクルとルーティングメカニズムを理解する

  13. 13

    グラフィカルなタイムスケジュールのHTMLテーブルまたはリスト

  14. 14

    シャイニー/リーフレット/ Rのズームレベルによるマーカークラスタリングの変更

  15. 15

    高度なカスタムフィールド、Wordpressでフィルタリング

  16. 16

    コンテストごとのカスタマイズを可能にする賞品テーブルのデータベースモデリング

  17. 17

    検索可能なフィールドのModelAdminカスタマイズ

  18. 18

    KERASモデルのトレーニング可能なパラメーターをカスタマイズする

  19. 19

    特定の列の可能なプレフィックスのリストでデータフレームをフィルタリングする

  20. 20

    カスタムDjangoカウントフィルタリング

  21. 21

    MATLABでの非常にノイズの多い/スパイキーな位置データのフィルタリング(またはアルゴリズムの作成?)

  22. 22

    マーカーサイズ/アルファスケーリングとウィンドウサイズ/プロット/散布図のズーム

  23. 23

    マーカーサイズ/アルファスケーリングとウィンドウサイズ/プロット/散布図のズーム

  24. 24

    QBFC:カスタムレポート-カスタムフィールドでフィルタリング

  25. 25

    ムービーリストJavaScriptのフィルタリング

  26. 26

    協調フィルタリング用のユーザーアイテムマトリックスの作成

  27. 27

    Django:ユーザーモデルのリターンフィールドをカスタマイズする

  28. 28

    アーキテクチャ:マングースを使用した時間フィルタリング可能なリーダーボードシステムの作成

  29. 29

    ヘクスのスターパスファインディングアルゴリズムのバグ

ホットタグ

アーカイブ