C#におけるFirstOrDefaultとSingleOrDefaultの違い、用途と具体例

June 07, 2023

top画像

C#でデータを操作する際には、頻繁にLINQ (Language Integrated Query) が使われます。その中にあるメソッド、FirstOrDefaultSingleOrDefaultはよく似ていますが、実際には重要な違いがあります。今回は、これら2つのメソッドの違い、それぞれの用途と具体例について詳しく見ていきましょう。

1. FirstOrDefaultとSingleOrDefaultの基本的な違い

両方のメソッドとも、シーケンスから最初の要素を返します。しかしながら、それらの動作は以下の通り異なります:

  • FirstOrDefault : シーケンスの最初の要素を返します。シーケンスが空の場合、デフォルト値(参照型ではnull、値型では0など)を返します。また、評価基準に一致する要素が複数存在する場合でも例外を投げずに最初の一つを返します。
  • SingleOrDefault : シーケンスの唯一の要素を返します。シーケンスが空の場合はデフォルト値を返しますが、評価基準に一致する要素が複数存在する場合は例外をスローします。

2. 用途と具体例

2.1 FirstOrDefault

FirstOrDefaultは、シーケンスが空であるか、または評価基準に一致する要素が複数存在する可能性がある場合に使用します。


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

int firstNumber = numbers.FirstOrDefault(); // 1
int firstEvenNumber = numbers.FirstOrDefault(n => n % 2 == 0); // 2
int nonExistingNumber = numbers.FirstOrDefault(n => n > 10); // 0

2.2 SingleOrDefault

SingleOrDefaultは、評価基準に一致する要素が高々1つだけ存在することを確認したい場合に使用します。一致する要素が複数ある場合には例外がスローされるため、これを適切にハンドリングすることが重要です。


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

int singleNumber = numbers.SingleOrDefault(n => n == 3); // 3
int nonExistingNumber = numbers.SingleOrDefault(n => n > 10); // 0

try {
    int multipleNumbers = numbers.SingleOrDefault(n => n % 2 == 0); // InvalidOperationException
} catch (InvalidOperationException ex) {
    Console.WriteLine(ex.Message);
}

3. まとめ

FirstOrDefaultSingleOrDefaultは似ていますが、それぞれ異なる用途があります。どちらのメソッドを使用するべきかは、あなたがシーケンスから何を期待しているかによります。あなたが期待する結果がシーケンスに1つだけ存在することを確認したい場合はSingleOrDefaultを、それ以外の場合はFirstOrDefaultを使用します。

これらのメソッドを理解し、適切に使用することで、C#でのデータ操作がより簡単かつ効率的になります。


Profile picture

Written by Mittsu
ベンチャー企業のしがないエンジニア。趣味はサッカーとTCG.

© 2024