修正履歴 2011/11/13 アップキャストをダウンキャストに修正
過去記事インデックス
IObservableの拡張メソッド
ここまでIObservable
LINQのメソッド
IObservable
下図はWhereでフィルタリングされた場合を表しています。Whereでフィルタリングされた場合はSelectやSubscribeまで処理はいきません。
実際にコードで動きを確認してみます。
// 値を発行するためのSubject var subject = new Subject<int>(); // AsObservableでIObservable<T>に変換(ダウンキャストでSubject<T>に戻せない var source = subject.AsObservable(); // 普通にSubscribe source.Subscribe( value => Console.WriteLine("1##OnNext({0})", value), ex => Console.WriteLine(ex.Message), () => Console.WriteLine("1##OnCompleted()")); // 奇数のみ通すようにフィルタリングして source.Where(i => i % 2 == 1) // 文字列に加工して .Select(i => i + "は奇数です") // 表示する .Subscribe( value => Console.WriteLine("2##OnNext({0})", value), ex => Console.WriteLine(ex.Message), () => Console.WriteLine("2##OnCompleted()")); // 1〜10の値をsubjectに対して発行する Observable.Range(1, 10).ForEach(i => subject.OnNext(i)); // 完了通知を行う subject.OnCompleted();
上記のコードでは、1〜10の値をSubject
その他に、今回初登場のメソッドとしてForEachメソッドがあります。これは引数に渡されたAction
今回の本題である拡張メソッドはWhereメソッドとSelectメソッドになります。Whereメソッドは引数で渡したFunc
このプログラムの実行結果を下記に示します。
1##OnNext(1) 2##OnNext(1は奇数です) 1##OnNext(2) 1##OnNext(3) 2##OnNext(3は奇数です) 1##OnNext(4) 1##OnNext(5) 2##OnNext(5は奇数です) 1##OnNext(6) 1##OnNext(7) 2##OnNext(7は奇数です) 1##OnNext(8) 1##OnNext(9) 2##OnNext(9は奇数です) 1##OnNext(10) 1##OnCompleted() 2##OnCompleted()
実行結果から、Whereによるフィルタリングが行われていることと、Selectによる変換が行われていることがわかると思います。
次回の予定
今回は、LINQのメソッドの中でも基本的なWhereとSelectを使用しました。LINQをしたことのある人なら自然に動作を理解できると思います。次回からは、そのほかの拡張メソッドも見ていこうと思います。