for WPF developers
Home Profile Tips 全記事一覧

System.Linq による拡張メソッドを使いこなす

(2017/03/07 16:12:45 created.)

C# ではコレクションに対する操作をおこなうコードを簡略化するために、System.Linq 名前空間で提供されている Enumerable クラスが公開している拡張メソッドを使用することが多くあります。コレクションを操作するために関数を自作しなくても、既に System.Linq によって提供されている機能でまかなえることもあるため、その拡張メソッドすべてに一度は目を通しておいた方が良いでしょう。

これら拡張メソッドの特徴として、ほとんどの拡張メソッドは遅延評価されるということがあります。遅延評価とは、そのメソッドが呼ばれるときに処理が実行されるわけではなく、そのシーケンスに実際にアクセスがあったときに初めて実行されることを指します。拡張メソッドによる処理を記述しておいても、実際に使われるまで処理がおこなわれないのでその結果がメモリにキャッシュされることがありません。遅延評価に関する詳細は「3.1.54 遅延評価について」を参照してください。

これらの拡張メソッドは一見便利な反面、実は効率が悪い場合もあります。例えば最大値を探索する拡張メソッドがありますが、線形探索をおこなっているため、膨大な要素数のシーケンスに対しては使わないほうがいいかもしれません。そういった内部実装も一度目を通すとより良いコードが書けるようになるでしょう。内部実装は下記 URL にてソースが公開されているのでそちらが参考になります。また、System.Core.dll を逆コンパイルして確認する方法もあります。逆コンパイルするためのソフトとしては ILSpy と呼ばれるソフトが有名です。フリーウェアなのでダウンロードして試してみてください。本節の中でも ILSpy を使って逆コンパイルした結果を一部掲載しています。

System.Linq.Enumerable クラスのコード掲載ページ:
https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs