Reactive Extensions (以下 Rx) の Observable クラスには、IObservable
拡張メソッドを使って何が嬉しいかというと、Subscribe で通知する内容をいじれること。フィルタリングしたり、変換したり、合成したりと自由自在。私自身、触り始めたばかりなので、嬉しい場面にはまだ出会っていなんですけどね。本格的に開発で使うようになれば出会うでしょう。きっと。
とにかく拡張メソッドの数が膨大なので、よく使いそうなものだけを、独断と偏見で紹介します。LINQ で使っていたメソッドばかりですけど、残りのメソッドは追々。
Where メソッド
IObservable
Observable.Range(1, 5) .Where(n => n % 2 != 0) .Subscribe(n => Console.WriteLine("Where:{0}", n)); // [実行結果] // Where:1 // Where:3 // Whare:5
Select メソッド
IObservable
Observable.Range(1, 5) .Select(n => "test" + n) .Subscribe(s => Console.WriteLine("Select:{0}", s)); // [実行結果] // Select:test1 // Select:test2 // Select:test3 // Select:test4 // Select:test5
SelectMany メソッド
SelectMany は渡された関数が返す IObservable
Select の戻り値で IObservable
SelectMany に渡すハンドラ内では、 IObservable
Observable.Range(1, 3) .SelectMany(n => Observable.Range(1, n)) .Subscribe(n => Console.WriteLine("SelectMany:{0}", n)); // [実行結果] // SelectMany:1 // SelectMany:1 // SelectMany:2 // SelectMany:1 // SelectMany:2 // SelectMany:3
Aggregate メソッド
IObservable
下は5の階乗を出力するサンプル。
Observable.Range(1, 5) .Aggregate((x, y) => x * y) .Subscribe(n => Console.WriteLine("Aggregate:{0}", n)); // [実行結果] // Aggregate:120
Zip メソッド
2 つの IObservable
Observable.Range(1, 5) .Zip(Observable.Range(1, 3), (n, right) => string.Format("left={0}, right={1}", n, right)) .Subscribe(s => Console.WriteLine("Zip:{0}", s)); // [実行結果] // Zip:left=1, right=1 // Zip:left=2, right=2 // Zip:left=3, right=3