【C#】LINQのFirst・FirstOrDefaultメソッド

Firstメソッド

LINQのFirstメソッドは配列の最初の要素を取り出します。

Firstメソッドを使用することで、IEnumerableを継承した配列やリストであれば、簡単に先頭の要素を取得することができます。

■公式ドキュメント
https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.first?view=net-5.0

サンプルコード

using System;
using System.Linq; // usingでSystem.Linqを追加

namespace linq_first
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] nums = { 10, 20, 100, 1000, 30 };

          // 配列numsの中から30以上のものを条件として、その最初の要素を取得
            var num = nums.Where(x => x >= 30).First();

            Console.WriteLine(num);
        }
    }
}

実行結果:
100

 

FirstOrDefaultメソッド

Firstメソッドでは返すべき要素がない場合には例外が発生してしまいます。

例外をtry~catchで処理することもできます。
しかし、FirstOrDefaultメソッドを使用することで例外の発生を防ぐことができます。

FirstOrDefaultは返すべき要素がない場合、既定値を返してくれます。

既定値は下記のように定義されています。
・参照型:null
・整数型:0
・実数型:0
・bool型:false

 

■公式ドキュメント
https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.firstordefault?view=net-5.0

サンプルコード

using System;
using System.Linq;

namespace linq_first
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] nums = { 10, 20, 100, 1000, 30 };

          // 返すべき要素がないため、例外(InvalidOperationException)が発生してしまう
            var num = nums.Where(x => x >= 1001).First();

            Console.WriteLine(num);
        }
    }
}

上記の実装では、返すべき要素がないため、例外が発生してしまいます。

そのような場合には、FirstOrDefaultを使用します。

using System;
using System.Linq;

namespace linq_first
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] nums = { 10, 20, 100, 1000, 30 };

          // FirstOrDefaultを使うことで例外を発生させない
            var num = nums.Where(x => x >= 1001).FirstOrDefault();

            Console.WriteLine(num);
        }
    }
}

実行結果:
0

int型のため返すべき要素がない場合、「」を返します。

 

First・FirstOrDefaultメソッドの使い分け

■Firstメソッドを使う場面
返すべき要素(データ)が必ずあるとわかっているとき。

■FirstOrDefaultを使う場面
返すべき要素(データ)があるかわからないとき。

このようにして、FirstメソッドとFirstOrDefaultメソッドを使い分けると良いかと思います。