『究極のC#プログラミング』 Chapter4 Findメソッド

ForEachメソッドのbreak問題

foreach文よりも、ForEachメソッドのほうが高速だが、breakがうまく機能しないという問題がある。
列挙して処理してる途中でbreakしたくても、breakはforeach/whileのようなループの中でしか機能しないから。


しかし、これはさほど問題にならない。
繰り返しメソッドには、ForEachだけでなく、Find, FindIndex, FindAllメソッドもある。

Findメソッド

このうちFindメソッドを考えてみよう。
Findメソッドの第二引数に渡すメソッドは、ForEachメソッドのようにAction(戻り値がvoid)ではなく、
Predicate(戻り値がbool)なデリゲートである。
そして、その引数に渡したメソッドがtrueを返す時に、列挙値をFindメソッドの戻り値として返す。


これを利用して、break文なしに、break相当のコードを書ける。

// 検索して最初に見つけたものを代入する
string result = Array.Find(array, (elem) => elem.Contains("hoge"));  


Findメソッドは、foreachよりソースを扱いやすくする。
なぜなら、検索機能と検索結果の処理機能を切り分けることが出来るから。
リファクタリング方法として、別個のメソッドとして定義して呼び出せるようになる。

FindAllメソッド

全ての検索結果を得る。
検索して1つだけ取得するのと違って、検索結果を格納するコレクションが生成されるので、メモリと実行速度にインパクトを与えてしまう。
しかし、foreachよりソースを扱いやすくする。