SlidingWindow
移動平均などを簡単に監視したいので、リアクティブエクステンションの演算子を作成しました。簡単な例として、マウスイベントを聞くためにサブスクライブしたいのですが、イベントがあるたびに、最後の3つを受け取りたいです( 3つおきのイベントが最後の3つを受け取るのを待っています)。そのため、私が見つけたウィンドウのオーバーロードでは、箱から出して必要なものが得られないようです。
これが私が思いついたものです。リスト操作が頻繁に行われることを考えると、これが最もパフォーマンスの高いソリューションではない可能性があることを恐れています。
public static IObservable<List<T>> SlidingWindow<T>(this IObservable<T> seq, int length)
{
var seed = new List<T>();
Func<List<T>, T, List<T>> accumulator = (list, arg2) =>
{
list.Add(arg2);
if (list.Count > length)
list.RemoveRange(0, (list.Count - length));
return list;
};
return seq.Scan(seed, accumulator)
.Where(list => list.Count == length);
}
これは次のように呼び出すことができます。
var rollingSequence = Observable.Range(1, 5).SlidingWindow().ToEnumerable();
しかし、驚いたことに、期待される結果を受け取る代わりに
1,2,3
2,3,4
3,4,5
結果を受け取ります
2,3,4
3,4,5
3,4,5
どんな洞察も大歓迎です!