こんにちは。福岡事務所のAです。

私は前回LINQを使用し、ソースコードの可読性を高める記事を書きました。
今回も可読性に注意しながら「配列などの複数要素から特定の条件に一致する先頭要素」を取得する方法について説明していきたいと思います。

さて、いきなり質問ですが、皆さんは配列から特定の条件に一致する先頭要素を取得したいときどのようにして取得しますか?
・配列の中をfor文などのループで回して条件に合う要素が見つかればそれを取得してbreakする…
条件に合った要素を取得することはできますが、可読性の視点から見るともう少しスマートに書きたい…

そこで登場するのがLINQメソッドの「First」です。

■Firstとは

 配列などの複数要素のうち、先頭の要素(条件を指定した場合は条件に一致する最初の要素)を返すメソッド

 ◆基本的な書き方①
  value = 配列.First(条件);

  このように書くだけで配列の中から条件に合った最初の要素をvalueに入れることができます。

  しかし、条件に一致する要素が1つもない場合System.InvalidOperationExceptionの例外が発生してしまいますので、
  実際にはより汎用的な「FirstOrDefault」というメソッドを使います。

 ◆基本的な書き方②
  value = 配列.FirstOrDefault(条件);

  こちらは条件に一致する要素が1つもない場合は型のデフォルト値(0やnullなどデータ型ごとにdefault構文で取得できる値)を返します。

 ここまで配列から要素を取得することについて書きましたが、もちろん配列だけではなく「List」などのコレクションにも使えます。

■「Last」、「Single」メソッド

 ちなみに類似機能として「Last」、「Single」があります。
 (それぞれにXxxOrDefaultがあります)

 Firstが最初の要素を返すのに対し、Lastは最後の要素を返します。
 Singleは条件を満たす唯一の要素を返します。

 しかし、Singleについては唯一の情報を取得する目的に使われるメソッドなので、条件に一致する要素が複数あった場合、
 System.InvalidOperationExceptionの例外が発生します。
 これは「SingleOrDefault」を使用しても同じなので注意が必要です。

■最後に

 今回紹介した方法についてそれぞれのメリットデメリットを書いていきたいと思います。

 ~配列の中をループで回す~
  【メリット】
   ・順にソースコードを追っていけばC#初心者の方が見ても処理の内容が分かる

  【デメリット】
   ・その処理で何がしたいのかという「目的」が分かりにくい

 ~First~
  【メリット】
   ・「First」と書いてあるので、パッと見て複数要素から1つ取得するということが分かる

  【デメリット】
   ・条件に合う要素が見つからなかった場合、System.InvalidOperationExceptionの例外が発生する

 ~FirstOrDefault~
  【メリット】
   ・「FirstOrDefault」と書いてあるので、パッと見て複数要素から1つ、もしくはデフォルト値を返すということが分かる
   ・条件に合う要素が見つからない場合でも型のデフォルト値を返すため、System.InvalidOperationExceptionの例外が発生しない

  【デメリット】
   ・初期値が指定できない

 この中だと可読性+条件に合う要素が見つからなかった場合を考慮して「FirstOrDefault」を使用するのが最適かと思われます。

 皆さんもぜひ参考にしてみてください。