ランダムな間隔で値を生成するがあり、IObservable
このシーケンスを抑制したいと考えています。私が発見したことの 1 つは、Throttle
オペレーターの「スロットリング」の定義が私のものと同じではないということです。
Throttle
指定された間隔が無音で経過した後にのみ値を生成します(最後に表示された値を生成します)。スロットリングとは、指定された間隔で値を生成することを意味すると思いました (もちろん、無音でない限り)。
Observable.Interval(100).Select((_,i) => i).Throttle(200)
たとえば、 「半分の速度」に調整しているため、(パフォーマンス/タイミングの問題をモジュロとして)偶数を生成することを期待していました。ただし、長さ 200 の無音期間が存在しないため、このシーケンスにはまったく価値がありません。
それで、私がSample
望む「スロットリング」動作を実際に行うことを発見しました。Observable.Interval(100).Select((_,i) => i).Sample(200)
偶数のシーケンスを生成します(ここでも、パフォーマンス/タイミングの問題をモジュロします)。
ただし、もう 1 つの問題があります。間隔は、最後に「サンプリングされた」値に応じて異なります。私が欲しいのは、次のような演算子を書くことです:
public static IObservable<T> Sample<T>(this IObservable<T> source, Func<T, TimeSpan> intervalSelector);
パラメータは次のサンプルのintervalSelector
間隔を生成し、最初のサンプルは...最初の値で取得されるか、追加のパラメータから取得されますが、気にしません。
これを書いてみましたが、うまく機能しない大規模で複雑な構造になってしまいました。私の質問は、これを既存の演算子を使用して (別名、ワンライナーで) 構築できますか?