Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

C#辞典

  1. トップページ
  2. C#辞典
  3. Enumerable.First() / Last() / Single()

Enumerable.First() / Last() / Single()

シーケンスの先頭・末尾・唯一の要素を取得する LINQ の拡張メソッドです。要素が存在しない場合にデフォルト値を返す『OrDefault』バリアントも合わせて解説します。

構文
using System.Linq;

// 先頭の要素を取得します(空の場合は例外)。
T first = source.First();
T first = source.First(x => 条件);

// 先頭の要素を取得します(空の場合は default を返します)。
T? firstOrDefault = source.FirstOrDefault();
T? firstOrDefault = source.FirstOrDefault(x => 条件);

// 末尾・唯一の要素も同様のオーバーロードがあります。
T last   = source.Last();
T single = source.Single();
メソッド一覧
メソッド概要
First()先頭の要素を返します。シーケンスが空の場合は例外を投げます。
FirstOrDefault()先頭の要素を返します。空の場合はデフォルト値(null や 0)を返します。
Last()末尾の要素を返します。シーケンスが空の場合は例外を投げます。
LastOrDefault()末尾の要素を返します。空の場合はデフォルト値を返します。
Single()唯一の要素を返します。0 件または 2 件以上の場合は例外を投げます。
SingleOrDefault()唯一の要素を返します。0 件の場合はデフォルト値、2 件以上の場合は例外を投げます。
ElementAt(index)指定インデックスの要素を返します。範囲外の場合は例外を投げます。
ElementAtOrDefault(index)指定インデックスの要素を返します。範囲外の場合はデフォルト値を返します。
サンプルコード
using System;
using System.Collections.Generic;
using System.Linq;

List<int> numbers = new List<int> { 3, 1, 4, 1, 5, 9, 2, 6 };

// 先頭の要素を取得します。
Console.WriteLine(numbers.First());               // 3
Console.WriteLine(numbers.First(n => n > 4));    // 5

// 末尾の要素を取得します。
Console.WriteLine(numbers.Last());                // 6
Console.WriteLine(numbers.Last(n => n < 3));     // 2

// 条件に合う唯一の要素を取得します(複数あると例外)。
List<int> solo = new List<int> { 10, 20, 30 };
Console.WriteLine(solo.Single(n => n == 20));     // 20

// 空のシーケンスでも例外を出さずデフォルト値を返します。
List<int> empty = new List<int>();
Console.WriteLine(empty.FirstOrDefault());        // 0(int のデフォルト値)
Console.WriteLine(empty.FirstOrDefault(-1));      // -1(.NET 6 以降でデフォルト値を指定可能)

// 文字列のデフォルト値は null です。
List<string?> strs = new List<string?>();
Console.WriteLine(strs.FirstOrDefault() ?? "なし"); // なし

// ElementAt でインデックス指定取得します。
Console.WriteLine(numbers.ElementAt(2));           // 4
Console.WriteLine(numbers.ElementAtOrDefault(99)); // 0(範囲外)
概要

『First()』『Last()』『Single()』はシーケンスが空または条件に合う要素が存在しない場合に『InvalidOperationException』を投げます。安全に取得したい場合は『OrDefault』バリアントを使ってください。

『Single()』は条件に合う要素が複数あった場合にも例外を投げます。「1 件だけ存在するはず」という業務ルールの確認に活用できますが、複数件の可能性がある場合は『First()』を使ってください。

.NET 6 以降では『FirstOrDefault(defaultValue)』のようにデフォルト値を直接指定できます。要素数を確認したい場合は『Enumerable.Count()』を、要素の有無だけを調べたい場合は『Enumerable.Any()』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。