カテゴリ: C# 更新日: 2026/01/26

C#のLINQでFirstとFirstOrDefaultの違いと使い方を完全解説!初心者向けガイド

C#のLINQでFirst・FirstOrDefaultの違いと使い方
C#のLINQでFirst・FirstOrDefaultの違いと使い方

先生と生徒の会話形式で理解しよう

生徒

「LINQでデータを取得するとき、FirstとFirstOrDefaultってどう違うんですか?」

先生

「どちらもコレクションから最初の要素を取得するメソッドですが、データが見つからないときの動作が大きく異なります。」

生徒

「具体的にはどんな違いがあるんですか?」

先生

「それでは、基本的な使い方から違いまで、詳しく見ていきましょう!」

1. FirstとFirstOrDefaultとは?

1. FirstとFirstOrDefaultとは?
1. FirstとFirstOrDefaultとは?

C#のLINQ(リンク)には、コレクションやリストから最初の要素を取得するためのメソッドがいくつかあります。その中でも代表的なのがFirstFirstOrDefaultです。

LINQとは、Language Integrated Query(ランゲージ・インテグレイテッド・クエリ)の略で、データベースのようにデータを検索したり絞り込んだりする機能を、C#のコードの中で簡単に使えるようにしたものです。まるで、たくさんの本が並んだ本棚から、欲しい本を探し出すような感覚でデータを扱えます。

FirstFirstOrDefaultは、どちらもコレクションの最初の要素を取得しますが、データが見つからなかったときの動作に大きな違いがあります。これを理解することで、プログラムがエラーで止まることを防ぎ、安全なコードを書けるようになります。

2. Firstメソッドの基本的な使い方

2. Firstメソッドの基本的な使い方
2. Firstメソッドの基本的な使い方

Firstメソッドは、コレクションから最初の要素を取得するメソッドです。リストや配列の一番最初のデータを取り出したいときに使います。

基本的な使用例


using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // 数値のリストを作成
        List<int> numbers = new List<int> { 10, 20, 30, 40, 50 };
        
        // 最初の要素を取得
        int firstNumber = numbers.First();
        
        Console.WriteLine($"最初の要素: {firstNumber}");
    }
}

実行結果


最初の要素: 10

このように、Firstメソッドを使うと、リストの最初の要素である10が取得できます。

条件を指定した使い方

Firstメソッドには条件を指定することもできます。条件に合う最初の要素を取得できるので、とても便利です。


using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 5, 12, 8, 20, 15 };
        
        // 10より大きい最初の要素を取得
        int firstLargeNumber = numbers.First(x => x > 10);
        
        Console.WriteLine($"10より大きい最初の要素: {firstLargeNumber}");
    }
}

実行結果


10より大きい最初の要素: 12

ここでx => x > 10という記述は、ラムダ式と呼ばれるもので、「xが10より大きい」という条件を表しています。つまり、リストの中から10より大きい数値を探して、最初に見つかったものを取得するという意味になります。

3. Firstメソッドの注意点:例外が発生する場合

3. Firstメソッドの注意点:例外が発生する場合
3. Firstメソッドの注意点:例外が発生する場合

Firstメソッドには重要な注意点があります。それは、条件に合う要素が見つからない場合、プログラムがエラーで止まってしまうということです。


using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
        
        try
        {
            // 100より大きい数値を探す(存在しない)
            int result = numbers.First(x => x > 100);
            Console.WriteLine($"結果: {result}");
        }
        catch (InvalidOperationException ex)
        {
            Console.WriteLine("エラー: 条件に合う要素が見つかりませんでした。");
        }
    }
}

実行結果


エラー: 条件に合う要素が見つかりませんでした。

このように、条件に合うデータがない場合、InvalidOperationExceptionという例外が発生します。例外とは、プログラムが正常に動作できない状況になったときに発生するエラーのことです。

4. FirstOrDefaultメソッドの基本的な使い方

4. FirstOrDefaultメソッドの基本的な使い方
4. FirstOrDefaultメソッドの基本的な使い方

FirstOrDefaultメソッドは、Firstと同じように最初の要素を取得しますが、要素が見つからなかった場合でもエラーにならず、代わりにデフォルト値を返します。

デフォルト値とは、そのデータ型の初期値のことです。数値型なら0、文字列型ならnull(何もない状態)、bool型ならfalseといった具合です。

基本的な使用例


using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 10, 20, 30, 40, 50 };
        
        // 最初の要素を取得
        int firstNumber = numbers.FirstOrDefault();
        
        Console.WriteLine($"最初の要素: {firstNumber}");
    }
}

実行結果


最初の要素: 10

要素が存在する場合は、Firstと同じように動作します。

要素が見つからない場合の安全な動作


using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
        
        // 100より大きい数値を探す(存在しない)
        int result = numbers.FirstOrDefault(x => x > 100);
        
        if (result == 0)
        {
            Console.WriteLine("条件に合う要素は見つかりませんでした。");
        }
        else
        {
            Console.WriteLine($"結果: {result}");
        }
    }
}

実行結果


条件に合う要素は見つかりませんでした。

このように、FirstOrDefaultはエラーを発生させず、デフォルト値の0を返します。その後、if文で結果をチェックすることで、安全に処理を続けられます。

5. FirstとFirstOrDefaultの違いを比較

5. FirstとFirstOrDefaultの違いを比較
5. FirstとFirstOrDefaultの違いを比較

それでは、二つのメソッドの違いを表で比較してみましょう。

比較項目 First FirstOrDefault
要素が存在する場合 最初の要素を返す 最初の要素を返す
要素が存在しない場合 例外が発生する デフォルト値を返す
エラー処理 try-catchが必要 if文でチェック可能
使用場面 必ず存在すると確信できる場合 存在しない可能性がある場合

6. 文字列のリストでの使い方

6. 文字列のリストでの使い方
6. 文字列のリストでの使い方

数値だけでなく、文字列のリストでも同じように使えます。実際のプログラムでよくある、名前のリストから特定の名前を探す例を見てみましょう。


using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<string> names = new List<string> { "田中", "佐藤", "鈴木", "高橋" };
        
        // "佐藤"で始まる名前を探す
        string foundName = names.FirstOrDefault(name => name.StartsWith("佐"));
        
        if (foundName != null)
        {
            Console.WriteLine($"見つかった名前: {foundName}");
        }
        else
        {
            Console.WriteLine("該当する名前は見つかりませんでした。");
        }
    }
}

実行結果


見つかった名前: 佐藤

文字列の場合、デフォルト値はnull(何もない状態)になります。そのため、if (foundName != null)という条件で、要素が見つかったかどうかを判定できます。

7. どちらを使うべきか?使い分けのポイント

7. どちらを使うべきか?使い分けのポイント
7. どちらを使うべきか?使い分けのポイント

実際のプログラミングでは、どちらのメソッドを使うべきか迷うこともあるでしょう。ここでは、使い分けのポイントをご紹介します。

Firstを使うべき場合

  • データが必ず存在すると確信できる場合
  • データがないことが明らかなエラーである場合
  • 例外を発生させて処理を中断したい場合

FirstOrDefaultを使うべき場合

  • データが存在しない可能性がある場合
  • データがなくても処理を続けたい場合
  • ユーザー入力やデータベース検索など、結果が不確実な場合

一般的には、FirstOrDefaultの方が安全で、プログラムが予期せず停止することを防げるため、初心者の方にはFirstOrDefaultの使用をおすすめします。

8. 実践的な使用例:商品検索システム

8. 実践的な使用例:商品検索システム
8. 実践的な使用例:商品検索システム

最後に、実際のアプリケーションで使いそうな例として、商品検索システムを作ってみましょう。


using System;
using System.Linq;
using System.Collections.Generic;

class Product
{
    public string Name { get; set; }
    public int Price { get; set; }
}

class Program
{
    static void Main()
    {
        List<Product> products = new List<Product>
        {
            new Product { Name = "ノートパソコン", Price = 80000 },
            new Product { Name = "マウス", Price = 2000 },
            new Product { Name = "キーボード", Price = 5000 }
        };
        
        // 価格が10000円以上の最初の商品を探す
        Product expensiveProduct = products.FirstOrDefault(p => p.Price >= 10000);
        
        if (expensiveProduct != null)
        {
            Console.WriteLine($"見つかった商品: {expensiveProduct.Name}");
            Console.WriteLine($"価格: {expensiveProduct.Price}円");
        }
        else
        {
            Console.WriteLine("条件に合う商品は見つかりませんでした。");
        }
    }
}

実行結果


見つかった商品: ノートパソコン
価格: 80000円

この例では、Productというクラスを作成し、商品名と価格を持つオブジェクトのリストから検索しています。FirstOrDefaultを使うことで、条件に合う商品がない場合でも安全に処理できます。

カテゴリの一覧へ
新着記事
New1
C#
C#のデフォルト引数と名前付き引数の使い方を解説!初心者でも安心のやさしい入門
New2
C#
C#のオブジェクト初期化子を完全ガイド!初心者でもわかる便利な使い方
New3
COBOL
COBOLの帳票出力と編集を完全マスター!条件付き表示で分かりやすい書類を作る方法
New4
COBOL
COBOLの帳票出力を完全攻略!数値項目のカンマ・小数点編集例を徹底解説
人気記事
No.1
Java&Spring記事人気No1
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.2
Java&Spring記事人気No2
C#
C#でJSONファイルを読み書きする方法(JsonSerializer・Newtonsoft.Json)
No.3
Java&Spring記事人気No3
C#
C#のLINQクエリ構文の書き方と基本操作をマスターしよう
No.4
Java&Spring記事人気No4
C#
C#でswitch式を使う方法!C# 8.0以降の新機能を解説
No.5
Java&Spring記事人気No5
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.6
Java&Spring記事人気No6
C#
C#のLINQ(リンク)とは?基本概念とデータ操作を初心者向けに徹底解説!
No.7
Java&Spring記事人気No7
C#
C#の非同期処理とUIスレッドをマスター!WPF/WinFormsでアプリが止まる問題を解決
No.8
Java&Spring記事人気No8
C#
C#のCancellationTokenを使ったキャンセル処理を完全ガイド!非同期処理を安全に止める方法