|
.NET TIPS
LINQのクエリ結果から先頭の要素だけを取り出すには?[3.5、C#、VB]
デジタルアドバンテージ 遠藤 孝信
2009/12/03 |
|
|
LINQによるクエリは常にオブジェクトのリストを返すが、クエリ結果が多くとも1つであると分かっている場合や、並べ替えた結果の先頭要素のみを取得したい場合などでは、その1つの要素を、Firstメソッドを使って取得できる。しかし、Firstメソッドはクエリ条件にマッチする要素が見つからない場合にInvalidOperationException例外を発生してしまう。
例外を発生させることなく、このような処理を行いたい場合には、Firstメソッドではなく、FirstOrDefaultメソッドを利用すればよい。これらはEnumerableクラス(System.Linq名前空間)などで実装されている拡張メソッドである。
FirstOrDefaultメソッドを使用したコード例を次に示す。ここでは、複数のUriオブジェクトから条件にマッチするUriオブジェクトを取り出すために、LINQのクエリを利用している。
using System;
using System.Linq;
class Program
{
static void Main(string[] args)
{
// テスト用データ
Uri[] urls = new Uri[]
{
new Uri("http://www.testserver.com"),
new Uri("http://www.testserver.com:8080"),
new Uri("http://www.dbserver.com"),
new Uri("http://www.dbserver.com:8080"),
new Uri("http://www.proxyserver.com"),
};
// 「devserver」を含むホスト名のUriを1つ取得
Uri oneDevServer = (from n in urls
where n.Host.Contains("devserver")
select n).FirstOrDefault();
if (oneDevServer == null)
{
Console.WriteLine("そのようなサーバはありません。");
}
// 出力:そのようなサーバはありません。
}
}
|
Imports System
Imports System.Linq
Class Program
Shared Sub Main()
' テスト用データ
Dim urls As Uri() = New Uri() { _
New Uri("http://www.testserver.com"), _
New Uri("http://www.testserver.com:8080"), _
New Uri("http://www.dbserver.com"), _
New Uri("http://www.dbserver.com:8080"), _
New Uri("http://www.proxyserver.com") _
}
' 「devserver」を含むホスト名のUriを1つ取得
Dim oneDevServer As Uri = _
(From n In urls _
Where n.Host.Contains("devserver") _
Select n).FirstOrDefault()
If oneDevServer Is Nothing Then
Console.WriteLine("そのようなサーバはありません。")
End If
' 出力:そのようなサーバはありません。
End Sub
End Class
|
|
FirstOrDefaultメソッドを使用したコード例(上:C#、下:VB) |
FirstOrDefaultメソッドは、対象となるリストに要素が見つからない場合には、既定値(デフォルト値)を返す。要素が参照型(何らかのクラスのオブジェクト)である場合の既定値はnull(VBではNothing)である。
利用可能バージョン:.NET Framework 3.5以降
カテゴリ:クラス・ライブラリ 処理対象:LINQ
使用ライブラリ:Enumerableクラス(System.Linq名前空間)
|
|
generated by
|
|
Insider.NET 記事ランキング
本日
月間