BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース LINQ to Objectsのためのインタラクティブエクステンション

LINQ to Objectsのためのインタラクティブエクステンション

原文(投稿日:2011/07/28)へのリンク

インタラクティブエクステンション(Interactive Extensions; Ix)とは、リアクティブエクステンション(Reactive Extensions; Rx)の成果をベースにしたLINQ to Objectsのオペレータセットだ。それらは、System.Linq名前空間で、IEnumerable型のオブジェクト用の拡張メソッドとして公開されている。ほとんどの開発者は、自分用のユーティリティライブラリとしてこれらの多くをすでに持っていると思うが、不足分が標準実装として提供されるのは価値があるだろう。

  • ForEachメソッド。ほとんどの開発者はこれを実装したことがあるだろう。2つのオーバーロードメソッドが提供されており、要素のみを使って反復処理ができるものと、要素とゼロベースのインデックスを使って反復処理ができるものがある。
  • Bufferメソッド。これは指定されたサイズに基づいて、コレクションを複数の小さなコレクションに分割するメソッドだ。Bufferメソッドは即時ロードと遅延ロードの両方を使用する。その時点で処理対象となっているバッファには即時ロードでソースとなるコレクションから要素が読み込まれるが、それ以降のバッファには現在処理中のバッファが使い終わるまで(末端まで列挙し終わるまで)要素が読み込まれない。
  • Catchメソッド。このメソッドはかなり興味深い。Catchメソッドは最後まで列挙し終わるか、例外がスローされるまで、コレクションから要素を取得する。後者の場合は、第2のソースから要素を取得し始める。第2のソースにはIEnumerable型のオブジェクトの他に、例外オブジェクトを受け取ってIEnumerable型のオブジェクトを返すFuncデリゲートを指定することもできる。
  • Concatメソッド。これは最初のコレクションの列挙が終わったら、次のコレクションを列挙するという単純なものだ。
  • Deferメソッド。このメソッドはコレクションの代わりにFuncデリゲートを受け取る。指定したFuncデリゲートは反復処理を行おうとした時に初めて実行される。
  • DistinctUntilChangedメソッド。これは連続した同一の要素を取り除くメソッドで、例えば、[A A B A A B]というコレクションは[A B A B]となる。
  • Doメソッド。このメソッドはForEachメソッドの変形版である。ForEachとの違いは、Doメソッドが返したコレクションを列挙した時に初めて、Doメソッドに渡したActionデリゲートが実行されるところだ。
  • DoWhileメソッド。これはSystem.Linq.EnumerableのTakeWhileメソッドに似ているが、DoWhileメソッドの条件判定用Funcデリゲートは列挙している要素を引数に受け取らない。
  • Forメソッド。このメソッドは興味深い問題を取り扱う。例えば、著者リストと書籍リストを返す検索用Funcデリゲートがあるとする。Forメソッドは著者オブジェクト毎に検索用Funcデリゲートを実行し、得られた書籍リストを連結して返す。
  • Generateメソッド。これはCスタイルのforループを模倣してコレクションを生成するメソッドだ。引数としてループの初期状態、ループの終了条件判定用Funcデリゲート、状態更新用Funcデリゲート、要素生成用Funcデリゲートを受け取る。ステートマシンをIEnumerableオブジェクトとして表す、といった使い方ができそうだ。
  • Ifメソッド。条件判定用Funcデリゲートと2つのコレクションを受け取り、Funcデリゲートの結果によって受け取った2つのコレクションのうちどちらか一方を返す。コレクションを1つしか受け取らないオーバーロードメソッドもあり、こちらはFuncデリゲートの戻り値がfalseの場合には空のコレクションを返す。
  • Memoizeメソッド。これはソースとなるコレクションの列挙を1度しか行わないようにするためのメソッドで、System.Linq.EnumerableのToListが呼び出し時に必ずソースとなるコレクションの列挙を行ってしまうのに対し、Memoizeは返されたコレクションから要素を取得しようとするまで列挙が行われないという違いがある。参照可能回数を受け取るオーバーロードメソッドを使うと、指定した回数だけアクセスすると要素が内部バッファから削除されるようになる。
  • MinメソッドとMaxメソッド。これらは名前の通りに動作する。MinByメソッドとMaxByメソッドは“最も売り上げの多い顧客を選択”のような表現を可能にするため、引数として各要素から比較に使用するオブジェクトを取り出すための評価用Funcデリゲートを受け取れるようにしたMinメソッド、Maxメソッドである。
  • OnErrorResumeNextメソッド。このメソッドは複数のコレクションの連結を行うためのもので、あるコレクションを処理している時にエラーが発生しても、残りのコレクションの連結処理は継続される。
  • Repeatメソッド。これは単純に同じ値が繰り返されたコレクションを作成するメソッドである。繰り返しの回数を指定することもできるし、無限にすることもできる。繰り返す値は、スカラー値でもコレクションでもよい。
  • Retryメソッド。このメソッドはコレクションの列挙の途中で例外が発生しても、成功するまで列挙を試みる。リトライ回数を指定することもできる。
  • Returnメソッド。これは引数で指定されたスカラー値を1つだけ含むコレクションを返すメソッドである。このメソッドがあれば、要素数1つの配列を明示的に作成する必要がなくなる。
  • Scanメソッド。複数のフィールドを合計するのに便利なメソッドである。System.Linq.EnumerableのAggregateメソッドとは異なり、Scanメソッドはsource.Scan(a=> Dollars +=a.Dollars).Scan(a=> Units +=a.Units)のように呼び出すことができる。
  • SkipLastメソッドとTakeLastメソッド。これらはSystem.Linq.EnumerableのSkipメソッド、Takeメソッドのミラーだ。
  • Throwメソッド。このメソッドは、要素にアクセスしようとすると例外をスローするコレクションを生成する。テストで使うのに便利だ。

Interactive Extensionsについてさらに学びたければ、Bart De Smet氏のプレゼンテーションを見てみるとよいだろう。また、ここから開発版をダウンロードできる。

この記事に星をつける

おすすめ度
スタイル

BT