【ITニュース解説】First() and FirstOrDefaut
2025年09月23日に「Dev.to」が公開したITニュース「First() and FirstOrDefaut」について初心者にもわかりやすく解説しています。
ITニュース概要
C#の`First()`と`FirstOrDefault()`は、コレクションの最初の要素を取得するメソッドだ。`First()`はコレクションが空だとエラーになるが、`FirstOrDefault()`は空の場合でもエラーにならず、型の初期値を返す。コレクションが空の可能性がある場合は、`FirstOrDefault()`を使うと安全なコードを書ける。
ITニュース解説
システム開発において、プログラムがデータを扱う際、しばしば「コレクション」と呼ばれるデータの集まりから、特定の情報を取り出す必要がある。例えば、顧客のリストから最初の顧客情報を取り出したり、商品の一覧から最初のアイテムを取得したりするといった状況だ。これまでのC#プログラミングでは、このような処理を行う際に、for文やforeach文といった「ループ」を使ってコレクションの要素を一つずつ確認し、目的の要素が見つかればそれを取り出して処理を中断するといった手法が一般的だった。しかし、この方法はコードが長く複雑になりがちで、特に最初の要素を取り出すだけであれば、もっとシンプルで洗練された方法があればと感じることが多かったのではないだろうか。
C#には、まさにこの目的のために用意された、非常に便利な二つのメソッドが存在する。それが「First()」と「FirstOrDefault()」である。これらは、コレクションから最初の要素を効率的かつ簡潔に取り出すための機能を提供し、あなたのプログラミング体験を大きく向上させるだろう。この記事では、これらのメソッドの機能、それぞれの違い、そしてどのような状況で使い分けるべきかについて詳しく解説する。
まず「First()」メソッドから見ていこう。この名前が示す通り、First()メソッドはコレクション、具体的にはリストや配列、データベースからのクエリ結果といったデータの集まりの中から、一番最初に格納されている要素を取得する役割を担っている。例えば、整数のリストが「1, 2, 3, 4, 5」という要素を持っていた場合、このリストに対してFirst()メソッドを呼び出すと、結果として「1」という値が返される。これは非常に直感的で、コードもシンプルになるため、プログラムを読みやすく、書きやすくしてくれる。このFirst()メソッドを利用するには、System.Linq名前空間をインポートする必要がある。
しかし、First()メソッドを使う際には一つ注意すべき点がある。それは、もしコレクションが「空」だった場合、つまり一つも要素を含んでいなかった場合に、プログラムが「InvalidOperationException」という種類のエラー(例外)を発生させてしまうということだ。このエラーが発生すると、プログラムのその場所での実行が強制的に停止してしまうため、もしあなたのプログラムが常にコレクションに要素が含まれていることを保証できないのであれば、予期せぬクラッシュにつながる可能性がある。
具体的なコードで考えてみよう。例えば、C#で以下のようなコードを書く場合だ。List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };という整数型のリストがあるとき、int firstNumber = numbers.First();と記述すると、firstNumberという変数にはリストの最初の要素である「1」が格納される。プログラムは正常に動作し、期待通りの結果が得られるだろう。
一方で、List<int> emptyNumbers = new List<int>();のように、何も要素が入っていない空のリストを作成し、int firstEmpty = emptyNumbers.First();と書くと、emptyNumbersリストには何も要素が入っていないため、この行を実行した際に「InvalidOperationException」が発生し、プログラムが停止してしまう。これは、First()メソッドが「コレクションには必ず要素が存在する」という前提で動作するためだ。
このため、First()メソッドは、そのコレクションが必ず一つ以上の要素を持つことが確実である場合にのみ適していると言える。例えば、システムで「必ず存在するはずの最初の注文データ」を取り扱う場合など、プログラマーが事前に要素の存在を保証できる場面では非常に有効だ。
次に「FirstOrDefault()」メソッドについて解説する。このメソッドはFirst()と非常に似ているが、コレクションが空の場合の挙動が異なるため、より安全で堅牢なコードを書く上で非常に重要な選択肢となる。FirstOrDefault()もFirst()と同様に、コレクションの最初の要素を取得する。しかし、もしコレクションが空だったとしても、First()のように例外をスローしてプログラムを停止させることはない。その代わりに、そのデータ型の「デフォルト値」を返すのだ。
ここで言う「デフォルト値」とは、C#の各データ型があらかじめ持っている、値が何も設定されていない場合の初期値のことを指す。例えば、整数の型(int)であればデフォルト値は「0」であり、文字列の型(string)や、自分で定義したクラスなどの参照型の場合は「null」(何も参照していない状態)がデフォルト値となる。
これもコード例で確認してみよう。List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };というリストに対してint firstNumber = numbers.FirstOrDefault();と記述した場合、firstNumberにはFirst()と同様にリストの最初の要素である「1」が格納される。
しかし、空のリストを扱う場合、挙動が大きく変わる。List<int> emptyNumbers = new List<int>();と空のリストを作成し、int firstEmpty = emptyNumbers.FirstOrDefault();と書いた場合、emptyNumbersリストは空だが、プログラムはエラーにならない。代わりにfirstEmptyにはint型のデフォルト値である「0」が格納される。
さらに、文字列のリストで試すと、List<string> emptyStrings = new List<string>();と空のリストを作成し、string firstEmptyString = emptyStrings.FirstOrDefault();と書いた場合、firstEmptyStringにはstring型のデフォルト値である「null」が格納される。
FirstOrDefault()メソッドは、このようにコレクションが空である可能性を考慮し、例外を避けつつプログラムを続行させることを可能にする。これにより、例えばデータベースからユーザーのプロフィール情報を取得する際に、もし該当するユーザーが見つからなかったとしても、アプリケーションがクラッシュすることなく、「ユーザーが見つかりませんでした」といった適切なメッセージを表示するような処理を実装できる。プログラマーは返された値がデフォルト値(例えばnull)かどうかをチェックすることで、コレクションが空だったかどうかを判断し、それに応じた処理を安全に記述できるのだ。
では、First()とFirstOrDefault()のどちらを選ぶべきなのだろうか。その選択は、あなたのプログラムが扱うコレクションに、必ず要素が含まれていると「確信」できるかどうかによる。
First()メソッドは、コレクションが常に少なくとも一つの要素を持つことが確実な場合に利用する。このメソッドは、コレクションが空である可能性を考慮するための余分なチェックを行わないため、わずかではあるがFirstOrDefault()よりも効率が良い可能性がある。しかし、この効率の差は通常、ごくわずかであり、コードの安全性の方がはるかに重要となる場合が多い。
一方、FirstOrDefault()メソッドは、コレクションが空である可能性がある場合に使うべきだ。これは、予期せぬエラーを防ぎ、プログラムの堅牢性を高める上で非常に有効な選択肢である。ほとんどの場合、コレクションが空である可能性はゼロではないため、FirstOrDefault()を使う方がより安全で、一般的な推奨される選択肢と言えるだろう。返された値がデフォルト値であるかどうかを確認するだけで、コレクションが空だった場合の処理を柔軟に記述できる。
これらのメソッドはC#プログラミングにおいて、コレクション操作をよりスマートで安全なものにしてくれる。First()は「最初の要素が必ず存在する」という前提で使い、FirstOrDefault()は「最初の要素が存在しないかもしれない」という可能性を考慮して使う、と覚えておくと良い。例外処理の手間を省き、コードの可読性も向上させるため、積極的に活用することをお勧めする。
これらのメソッドは、C#におけるデータ操作の強力なツールであるLINQ(Language Integrated Query)の一部としても利用できる。LINQと組み合わせることで、より複雑な条件に基づいてコレクションから特定の最初の要素を効率的に見つけ出すことも可能になる。例えば、「特定の条件に合致する最初の顧客」を検索するといったことも容易に実現できるのだ。
さらに学習を深めたいのであれば、これらの兄弟メソッドである「Last()」と「LastOrDefault()」についても調べてみると良いだろう。これらはFirst()とFirstOrDefault()と同様の機能を持つが、コレクションの「最後の要素」に対して操作を行う。さまざまなコレクションの種類で実際にこれらのメソッドを試してみて、どのように動作するかを体験することが、理解を深める最も良い方法となるだろう。