コレクション LINQ

[C#] コレクション要素で条件に合致する最初の要素を取得する(.First、.FirstOrDefault)

2021年7月19日

コレクション要素で条件に合致する最初の要素を取得するには
.First.FirstOrDefault を使用します。

.Firstは対象の要素が存在しない場合はExceptionが発生しますが、
.FirstOrDefaultは対象の要素が存在しない場合はデフォルト要素を返します。

サンプル

例1)List型の場合

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

//intのListを生成
List<int> list = new List<int>(){6, 3, 7, 3, 5, 3};

//7以上要素で一番始めに見つかったものを返す
int result = list.First(x => x >= 7);
→ 7

//8以上要素で一番始めに見つかったものを返す
int result = list.First(x => x >= 8);
→ InvalidOperationExceptionが発生

//8以上要素で一番始めに見つかったものを返す(存在しない場合はデフォルト値を返す)
int result = list.FirstOrDefault(x => x >= 8);
→ 0

例2)Dictionary型の場合

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

//Dictioinaryの生成
Dictionary<string, string> dc = new Dictionary<string, string>();
dc.Add("01", "大阪市");
dc.Add("02", "京都市");
dc.Add("03", "神戸市");
dc.Add("04", "東京都");

//Value値に"都"が含まれる一番始めの要素を返す
var result = dc.First(x => x.Value.Contains("都"));
→ ["02", "京都市"]

//Value値に"県"が含まれる一番始めの要素を返す
var result = dc.First(x => x.Value.Contains("県"));
→ InvalidOperationExceptionが発生

//Value値に"県"が含まれる一番始めの要素を返す(存在しない場合はデフォルト値を返す)
var result = dc.FirstOrDefault(x => x.Value.Contains("県"));
→ [null, null]

例3)データクラスListの場合

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

//データクラス(Prefクラス)
class Pref{
  public int No {get; set;}
  public string Name {get; set;}
  public int Population {get; set;}
}

//PrefのListを生成
var list = new List<Pref>();
list.Add(new Pref{No=1, Name="北海道", Population=5381733});
list.Add(new Pref{No=2, Name="青森県", Population=1308265});
list.Add(new Pref{No=3, Name="岩手県", Population=1279594});
list.Add(new Pref{No=4, Name="宮城県", Population=2333899});
list.Add(new Pref{No=5, Name="秋田県", Population=1023119});

//Pref.Populationが130万以下の一番始めの要素を返す
var result = dc.First(x => x.Population <= 1300000);
→ 岩手県

//Pref.Populationが100万以下の一番始めの要素を返す
var result = dc.First(x => x.Population <= 1000000);
→ InvalidOperationExceptionが発生

//Pref.Populationが100万以下の一番始めの要素を返す(存在しない場合はデフォルト値を返す)
var result = dc.FirstOrDefault(x => x.Population <= 1000000);
→ [0, null, 0]

備考

  • LINQを使用するには、「using System.Linq;」の宣言が必要です。
  • .FirstOrDefaultのデフォルト要素とは、対象要素の初期値です。
    (例:int型→0、string型→null、データクラス→newした時の値 など)
  • .Firstと.FirstOrDefaultの使い分けは、例外の発生を許容するかしないかで判断するとよいかと思います。

関連記事

-コレクション, LINQ