過去記事インデックス
- Reactive Extensions再入門 その1
- Reactive Extensions再入門 その2「IObservableインターフェースとIObserverインターフェース」
- Reactive Extensions再入門 その3「IObservableのファクトリメソッド」
- Reactive Extensions再入門 その4「Timer系のファクトリメソッド」
- Reactive Extensions再入門 その5「HotとCold」
- Reactive Extensions再入門 その6「HotなIObservableを作成するファクトリ」
- Reactive Extensions再入門 その7「LINQスタイルの拡張メソッド」
- Reactive Extensions再入門 その8「SkipとTakeメソッド」
- Reactive Extensions再入門 その9「Skip + Take + Repeat = ドラッグ」
- Reactive Extensions再入門 その10「Doメソッド」
- Reactive Extensions再入門 その11「Catchメソッド」
- Reactive Extensions再入門 その12「Finallyメソッドとリソース解放」
- Reactive Extensions再入門 その13「最後の値を取得するLatestとMostRecentメソッド」
- Reactive Extensions再入門 その14「Nextメソッド」
- Reactive Extensions再入門 その15「To*****系メソッド」
- Reactive Extensions再入門 その16「最大、最少、平均を求めるメソッド」
- Reactive Extensions再入門 その17「集計するメソッド」
- Reactive Extensions再入門 その18「CountメソッドとLongCountメソッド」
- Reactive Extensions再入門 その19「AnyメソッドとAllメソッド」
- Reactive Extensions再入門 その20「GroupByメソッドでグルーピングしてみよう」
- Reactive Extensions再入門 その21「GroupByUntilメソッド」
- Reactive Extensions再入門 その22「単一の値を取得するメソッド」
- Reactive Extensions再入門 その23「重複を排除するメソッド」
- Reactive Extensions再入門 その24「単一の値を取得するメソッド その2」
- Reactive Extensions再入門 その25「値をまとめるBufferメソッド」
はじめに
このシリーズもその26まで来ました。まだしばらく続きます。いくつまでいくのかな・・・。
Windowメソッド
ここではWindowメソッドについて説明します。Windowメソッドは、ここまで説明してきたBufferメソッドとほぼ同じ動きをします。指定した時間や数や間隔で柔軟に値をまとめることが出来ます。Bufferメソッドとの違いを比べるために数でまとめる一番シンプルなオーバーロードを並べて以下に示します。
まずは、Bufferメソッドです。
public static IObservable<IList<T>> Buffer<T>( this IObservable<T> source, int count);
次に、Windowメソッドを示します。
public static IObservable<IObservable<T>> Window<T>( this IObservable<T> source, int count);
Bufferメソッドの戻り値がIObservable
まずは、これまで使ってきたBufferメソッドのコード例を下記に示します。
// 値の発行元 var source = new Subject<int>(); source // 3つずつに纏める .Buffer(3) .Subscribe( l => { // 値を表示 Console.WriteLine("--Buffer"); // IList<T>なのでループを使って値を出力 foreach (var i in l) { Console.WriteLine(i); } }, () => { // 完了通知 Console.WriteLine("Buffer Completed"); }); // 1〜4の値を発行して終了 Console.WriteLine("OnNext(1)"); source.OnNext(1); Console.WriteLine("OnNext(2)"); source.OnNext(2); Console.WriteLine("OnNext(3)"); source.OnNext(3); Console.WriteLine("OnNext(4)"); source.OnNext(4); Console.WriteLine("OnCompleted()"); source.OnCompleted();
Subject
OnNext(1) OnNext(2) OnNext(3) --Buffer 1 2 3 OnNext(4) OnCompleted() --Buffer 4 Buffer Completed
実行結果からわかるように、IObservable
// 値の発行元 var source = new Subject<int>(); source // 3つずつに纏める .Window(3) .Subscribe( o => { // 値を表示 Console.WriteLine("--Window"); // IO<T>なのでSubscribeでOnNextを使って出力する o.Subscribe(Console.WriteLine); }, () => { // 完了通知 Console.WriteLine("Window Completed"); }); // 1〜4の値を発行して終了 Console.WriteLine("OnNext(1)"); source.OnNext(1); Console.WriteLine("OnNext(2)"); source.OnNext(2); Console.WriteLine("OnNext(3)"); source.OnNext(3); Console.WriteLine("OnNext(4)"); source.OnNext(4); Console.WriteLine("OnCompleted()"); source.OnCompleted();
BufferメソッドをWindowメソッドに変えたのと、SubscribeのOnNextで渡ってくる型がIObservable
--Window OnNext(1) 1 OnNext(2) 2 OnNext(3) 3 --Window OnNext(4) 4 OnCompleted() Window Completed
Bufferメソッドが、値が3つ揃ってからIList
そのためBufferメソッドは、値が全て揃ってから後続に値を流したい場合に、Windowメソッドは、値が発行されたら即座に後続に値を流したい場合に利用します。その他のオーバーロードに関しても挙動は同じになります。そのため、ここではその他のWindowメソッドのオーバーロードについての説明は割愛します。