これはそれを行う必要があります。
public static IObservable<T> ThrottleTime<T>(this IObservable<T> source, TimeSpan ts)
{
return ThrottleTime(source, ts, Scheduler.Default);
}
public static IObservable<T> ThrottleTime<T>(this IObservable<T> source, TimeSpan ts, IScheduler scheduler)
{
return source
.Timestamp(scheduler)
.Scan((EmitValue: false, OpenTime: DateTimeOffset.MinValue, Item: default(T)), (state, item) => item.Timestamp > state.OpenTime
? (true, item.Timestamp + ts, item.Value)
: (false, state.OpenTime, item.Value)
)
.Where(t => t.EmitValue)
.Select(t => t.Item);
}
説明:単一の状態変数を持つようThrottleTime
を考える:ゲートが新しい値に開く次回。ソースアイテムがこのタイムゲート値の前にある場合、何も起こりません。ソース項目がそれより後にある場合は、通過させ、ゲート値を最新のタイムスタンプにリセットします。
Scan
は、タプルの時間値(OpenTime
変数)を保持します。タプルの他のフィールドは、より下流で役立ちます。