C#ライブラリリファレンス - データの集合の中から最初に条件に一致した要素もしくはデフォルト値を取得する
Enumerable静的クラスのFirstOrDefault拡張メソッドを使用すれば、例外を発生させずに、最初の要素を取得できます。存在しない場合は、デフォルト値を取得します。
日常でたとえると
指定した売上ノルマを達成した社員を捜し、いなければ、「該当なし」とする。
使用に適した状況
指定した条件を満たす最初のデータを探したいものの、例外の発生は避けたい場合。ただし、例外処理が面倒というだけで使用してはなりません。
サンプル
/*----------------------------------------------------
*
* データの集合の中から
* 最初に条件に一致した要素
* もしくはデフォルト値を取得する
*
----------------------------------------------------*/
using System;
using System.Linq;
using System.Collections.Generic;
class Sample
{
static void Main( )
{
//要素が存在しないときに取り出す
int max = 10;
List values = new List();
if ( values.FirstOrDefault() == null ) {
Console.WriteLine(
"まだデータが存在していません" );
}
//不完全なランダム値を用意
Random d = new Random();
for ( int i = 0 ; i < max ; ++i )
values.Add( d.Next( 0, 100 ).ToString() );
Console.WriteLine();
Console.WriteLine( "データ" );
foreach ( string v in values )
Console.Write( "{0} ", v );
Console.WriteLine( Environment.NewLine );
//最大値よりも大きい値を取得しようとする
string result = values.FirstOrDefault(
x => Int32.Parse( x ) > 100 );
if ( result == null )
Console.WriteLine( "101以上の値はありません" );
Console.WriteLine();
//終了
Console.WriteLine( "サンプル終了。" );
Console.ReadLine();
}
}
名前空間
System.Linq名前空間を参照してください。
解説
特定の条件を満たす最初の要素を取得したい場合があります。このような処理では、通常のプログラムは例外の発生があります。しかしながら、ユーザーが直接指定するなどといった状況では、例外が発生することは好ましくありません。何故ならば、間違えるのが「仕様」だからです。
基本的には、例外処理は仕様外の事が起こった時にスローされるのが望ましいです。それは、プログラマーが間違ったプログラムを書いた時や、通信トラブルが起こった時などです。このような観点から、通常は例外処理を避けるべきではありません。ただし、間違った指示をされるのが通常の状態である場合、一々例外をスローしていれば、パフォーマンスが低下しますし、愛想がいいシステムとは呼べません。システムには、ある程度の柔軟性が必要なのです。
このような場合に使用するのがFirstOrDefault拡張メソッドです。ただし基本的には、例外が発生する方が好ましいので、極力使用しないようにしましょう。