C#
 Computer >> コンピューター >  >> プログラミング >> C#

C# LINQのLast()とLastOrDefault()の違いとは?使い分けのポイントを解説

C#のLINQにおけるLast()LastOrDefault()は、どちらもシーケンス(コレクション)の中から指定した条件に一致する最後の要素を取得するメソッドです。しかし、両者には重要な違いがあります。

Last()は、指定した条件に一致する要素が1つも存在しない場合に例外(InvalidOperationException)をスローします。一方、LastOrDefault()は一致する要素が存在しない場合でも例外をスローせず、既定値(参照型の場合はnull)を返します。

Last()とLastOrDefault()の使い分け

  • Last():シーケンスに必ず1つ以上の一致する要素が存在することが保証されている場合に使用します。
  • LastOrDefault():データが存在するかどうか確信できない場合に使用します。戻り値のnullチェックを行うことで、例外を回避しながら安全に処理を進められます。

例1:条件に一致する要素が存在する場合

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace ConsoleApp {
    public class Student {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    class Program {
        static void Main() {
            var studentsList = new List<Student> {
                new Student {
                    Id = 1,
                    Name = "John"
                },
                new Student {
                    Id = 2,
                    Name = "Jack"
                },
                new Student {
                    Id = 1,
                    Name = "Jill"
                }
            };
            var lastOrDefaultStudent = studentsList.LastOrDefault(student => student.Id == 1);
            var lastStudent = studentsList.Last(student => student.Id == 1);
            Console.WriteLine($"LastOrDefault: {lastOrDefaultStudent.Id} {lastOrDefaultStudent.Name}");
            Console.WriteLine($"Last: {lastStudent.Id} {lastStudent.Name}");
            Console.ReadLine();
        }
    }
}

出力結果

上記コードの出力は以下の通りです。

LastOrDefault: 1 Jill
Last: 1 Jill

この例では、Id「1」に一致する学生がリスト内に2人存在するため、どちらのメソッドも最後の要素である「Jill」を正常に返しています。

例2:条件に一致する要素が存在しない場合

using System;
using System.Collections.Generic;
using System.Linq;
namespace DemoApplication {
    class Program {
        static void Main(string[] args) {
            try {
                var studentsList = new List<Student> {
                    new Student {
                        Id = 1,
                        Name = "John"
                    },
                    new Student {
                        Id = 2,
                        Name = "Jack"
                    }
                };
                var lastOrDefaultStudent = studentsList.LastOrDefault(student => student.Id == 3);
                var value = lastOrDefaultStudent == null ? "null" : "";
                Console.WriteLine($"LastOrDefault: {value}");
                var lastStudent = studentsList.Last(student => student.Id == 3);
            }
            catch (Exception ex) {
                Console.WriteLine($"Last Exception: {ex.Message}");
                Console.ReadLine();
            }
        }
    }
    public class Student {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

出力結果

上記コードの出力は以下の通りです。

LastOrDefault: null
Last Exception: Sequence contains no matching element

この例では、リスト内にId「3」を持つ学生が存在しません。そのため、LastOrDefault()nullを返す一方で、Last()は「Sequence contains no matching element(シーケンスに一致する要素が含まれていません)」という例外をスローします。

まとめ:比較表

ケースLast()LastOrDefault()
一致する要素が存在する場合最後の要素を返す最後の要素を返す
一致する要素が存在しない場合InvalidOperationExceptionをスローnull(既定値)を返す

この挙動の違いは、First()FirstOrDefault()の関係と同じです。データの存在が保証されていない場面では、LastOrDefault()を使用してnullチェックを行うのが安全な実装と言えます。

  1. DirectX11とDirectX12の違いを徹底解説!ゲーマーが知っておくべきポイント

    DirectXは、ソフトウェアがマルチメディアコンテンツを描画し、グラフィックハードウェアと通信するために使用されるAPI(アプリケーションプログラミングインターフェース)のコレクションです。DirectXの主要な構成要素であるDirect3Dは、ソフトウェアとグラフィックスハードウェア間の通信を担っています。ハードウェアは製品ごとに異なるため、標準化された関数や呼び出しのライブラリを通じてグラフィックカードと通信することで、ゲーム開発を大幅にスピードアップできます。これは「ハードウェア抽象化」と呼ばれ、APIの最も重要な役割となっています。車に例えてみましょう。1台の車の運転ができれば、ほぼ

  2. C#の配列とリスト(List)の違いとは?特徴と基本的な使い方を解説

    C#における配列(Array)とリスト(List<T>)は、どちらも複数のデータをまとめて扱うためのコレクションですが、その性質には重要な違いがあります。 配列とリストの主な違い 配列は、生成時にサイズが固定される、同じ型の要素を順番に格納するコレクションです。一度作成した後は要素数を変更できません。 一方、Listはジェネリックコレクションであり、要素の追加や削除に応じてサイズが自動的に拡張・縮小します。この柔軟性が最大の特徴です。 項目配列List<T> サイズ固定可変(動的) 要素の追加不可(再作成が必要)Addメソッドで可能 宣言方法型[] 変数名Lis