LINQのFirstメソッド、FirstOrDefalutメソッドを使うと、配列・コレクションから条件を満たす最初を要素を取り出すことができます。
2つのメソッドの違いは、
Firstメソッドは条件を満たす要素がなかった場合にエラーになり、
FirstOrDefaltメソッドは条件を満たす要素がなかった場合に要素のデータ型のデフォルト値が返されます。
条件を満たす要素が必ず存在するとわかっているときにFirstメソッド、
それ以外の場合にFirstOrDefaultメソッドを使うといいと思います。
LINQってなに?という方は、[C# 入門] LINQについてのざっくり解説を見てください。
First、FirstOrDefaultメソッドの使い方
First、FirstOrDefaultメソッドの引数には条件を指定するメソッドを指定します。
戻り値は条件に一致する最初の要素になります。
条件を指定するメソッドの引数にはデータソース(配列、リストなど)の各要素が渡されます。
戻り値はBoolean型(TrueまたはFlase)の値を返すようにします。
その要素が条件を満たす場合にTrue、満たさない場合にFalseを返します。
ラムダ式を使って匿名関数を渡すと簡単に各メソッドに引数を指定することができます。ラムダ式?という方は、[C# 入門] 匿名関数(ラムダ式)の使い道を見てください。
配列、リストともに2つのメソッドの使い方に違いはないのですが、コードが長くなったためサンプルを2つに分けました。
LINQを使うには、名前空間System.Linq が必要です。
using System.Linq;
配列から条件を満たす最初の要素を取り出すサンプル
using System;
using System.Linq;
class Program
{
public static void Main()
{
// データソース(int型の配列)
int[] ary = new int[] { 1, 2, 3, 4, 5 };
// FirstOrDefaultメソッドで条件を満たす最初の要素を取得
int first_element = ary.FirstOrDefault(i => i % 2 == 0);
Console.WriteLine($"条件(要素が偶数)を満たす最初の要素={first_element}");
// 条件を満たす要素がない場合はデフォルト値(0)が返ってくる
first_element = ary.FirstOrDefault(i => i == 100);
Console.WriteLine($"条件(要素が100)を満たす最初の要素={first_element}");
// Firstメソッドも条件を満たす最初の要素を取得することができる
// が、条件を満たす要素がなかった場合にエラーになるので注意
first_element = ary.First(i => i % 2 == 0);
Console.WriteLine($"条件(要素が偶数)を満たす最初の要素={first_element}");
// ↓は条件を満たす要素がないためエラーになる
//first_element = ary.First(i => i == 10);
}
}
条件(要素が偶数)を満たす最初の要素=2
条件(要素が100)を満たす最初の要素=0
条件(要素が偶数)を満たす最初の要素=2
要素はint型なので、条件を満たす要素がない場合は0が返ってきます。
デフォルト値が0だと「条件を満たさなくて0なのか?」それとも「初めから0が要素にあった」のかわかりにくいという場合は、null許容型を使ってデフォルト値をnullが返されるようにします。
using System;
using System.Linq;
class Program
{
public static void Main()
{
// intのnull許容型の配列
int?[] nullable_ary = new int?[] { 1, 2, 3 };
// 条件を満たす最初の要素を取得
var first_element = nullable_ary.FirstOrDefault(i => i == 100);
Console.WriteLine($"first_elementはnullですか?={first_element is null}");
}
}
first_elementはnullですか?=True
リストから条件を満たす最初の要素を取り出すサンプル
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
public static void Main()
{
// データソース(SampleDataクラス型のリスト)
var list = new List<SampleData> {
new SampleData { Data1 = 10, Data2 = 11 },
new SampleData { Data1 = 10, Data2 = 12 },
new SampleData { Data1 = 20, Data2 = 11 },
new SampleData { Data1 = 20, Data2 = 12 },
};
// FirstOrDefaultメソッドで条件を満たす最初の要素を取得
SampleData first_data = list.FirstOrDefault(d => d.Data1 == 20);
Console.WriteLine($"条件(Data1が20)を満たす最初の要素=[ Data1={first_data.Data1}, Data2={first_data.Data2} ]");
// 条件を満たす要素がない場合はデフォルト値(null)が返ってくる
first_data = list.FirstOrDefault(d => d.Data1 == 100);
Console.WriteLine($"first_dataはnullですか?={first_data is null}");
}
}
class SampleData
{
public int Data1 { get; set; }
public int Data2 { get; set; }
}
条件(Data1が20)を満たす最初の要素=[ Data1=20, Data2=11 ]
first_dataはnullですか?=True
要素はクラス(参照型)なので条件を満たす要素がない場合にnullが返ってきます。
条件に関係なく最初の要素を取得
First、FirstOrDefaultメソッドにはオーバーライドがあり、引数に何も指定しなかった場合に先頭の要素を取得することができます。
Firstメソッドは要素数が0個の場合にエラーになるので注意してください。
FirstOrDefaultメソッドはデフォルト値が返ってきます。
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
public static void Main()
{
// 先頭の要素を取得
List<int> list = new List<int> { 1, 2, 3 };
Console.WriteLine($"listの先頭の要素={list.First()}");
Console.WriteLine($"listの先頭の要素={list.FirstOrDefault()}");
// 空のリストの場合
List<int> empty_list = new List<int>();
//Console.WriteLine($"empty_listの先頭の要素={empty_list.First()}"); // エラーになる
Console.WriteLine($"empty_listの先頭の要素={empty_list.FirstOrDefault()}");
}
}
listの先頭の要素=1
listの先頭の要素=1
empty_listの先頭の要素=0
C# 記事まとめページに戻る(他のサンプルコードもこちら)
コメント