.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)である。End of Article

利用可能バージョン:.NET Framework 3.5以降
カテゴリ:クラス・ライブラリ 処理対象:LINQ
使用ライブラリ:Enumerableクラス(System.Linq名前空間)

この記事と関連性の高い別の.NET TIPS
Listの要素を検索するには?[C#/VB]
リスト(List)の列挙中にリスト要素を削除するには?[C#、VB]
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間