『究極の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よりソースを扱いやすくする。