C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のLINQは結果が空の場合に何を返すのか?


統合言語クエリ(Language-Integrated Query:LINQ)とは、クエリ機能をC#言語に直接組み込むことを目的とした、一連のテクノロジーの総称です。

LINQを利用すれば、SQL Serverデータベース、XMLドキュメント、ADO.NETデータセット、さらにはIEnumerableインターフェースやジェネリック版のIEnumerable<T>を実装したあらゆるオブジェクトコレクションに対して、C#のコードとして自然にクエリを記述できます。

結果が空の場合、LINQは何を返す?

LINQのクエリ結果が空だった場合の挙動は、呼び出すメソッドによって大きく異なります。

First()やSingle()を呼び出した場合

LINQ to SQLなどにおいて、結果が一件も存在しないシーケンスに対してFirst()メソッドで先頭要素を取得しようとすると、「Sequence contains no elements(シーケンスに要素が含まれていません)」というInvalidOperationException例外がスローされます。

このようなエラーを避けたい場合は、条件に一致する要素がなければ既定値(nullや0など)を返すFirstOrDefault()やSingleOrDefault()を使用するのが安全です。

ToList()を呼び出した場合

一方、ToList()メソッドを使用した場合は例外が発生せず、空のリストが返されます。そのため、Count()の結果は0となり、foreachループの処理も一切実行されず、プログラムは正常に終了します。

以下の2つのサンプルコードで、実際の動作を確認してみましょう。

サンプルコード1:文字列のリストの場合

リストには「a」という要素のみが格納されており、Where句の条件「x == "ABC"」には一致しないため、クエリ結果は空になります。

class Program{    public static void Main(){        List<string> list = new List<string> { "a" };        IEnumerable<string> ilist = list.Where(x => x == "ABC").ToList();        System.Console.WriteLine(ilist.Count());        foreach (var item in ilist){            System.Console.WriteLine(item);        }        Console.ReadLine();    }}

実行結果

0

サンプルコード2:整数のリストの場合

次に、整数型のリストで同じ処理を試します。リストには「1」だけが格納されていますが、条件「x == 3」には一致しないため、こちらでも結果は空となります。

class Program{    public static void Main(){        List<int> list = new List<int> { 1 };        IEnumerable<int> ilist = list.Where(x => x == 3).ToList();        System.Console.WriteLine(ilist.Count());        foreach (var item in ilist){            System.Console.WriteLine(item);        }        Console.ReadLine();    }}

実行結果

0

まとめ

LINQで結果が空の場合の戻り値は、使用するメソッドによって以下のように異なります。

  • First() / Single():要素が存在しない場合、例外(InvalidOperationException)がスローされる
  • FirstOrDefault() / SingleOrDefault():要素が存在しない場合、型の既定値(参照型ならnull)が返される
  • ToList()やWhere()などのシーケンス系メソッド:空のシーケンス(空のリスト)が返され、例外は発生しない

結果が空になる可能性がある場合は、FirstOrDefault()を使うか、ToList()で取得後にCount()やAny()で要素の有無を確認するなど、状況に応じて適切な方法を選択することが重要です。


  1. Java 9の不変(イミュータブル)コレクションのメリットとは?

    Java 9では、Collections APIに複数のファクトリメソッドが追加されました。これらのファクトリメソッドを利用することで、変更不可(unmodifiable)なList・Set・Mapのコレクションオブジェクトを簡単に作成でき、コードの行数を大幅に削減できます。List.of()、Set.of()、Map.of()、Map.ofEntries()は、Java 9において不変(イミュータブル)コレクションを手軽に生成するための静的ファクトリメソッドです。不変コレクションのメリットヒープ領域の節約:従来のJavaバージョンでの作成方法と比較して、コレクションデータを格納するために必要

  2. Javaのジェネリックコレクションとは?用途とメリットをわかりやすく解説

    ジェネリックコレクションは、Java 5で導入された機能です。最大の特徴は型キャスト(キャスト変換)が不要になる点にあります。ジェネリクスを使用することで、コレクションから要素を取り出す際にいちいちキャストを書く必要がなくなり、コードがシンプルになります。さらに、ジェネリックコレクションは型安全(タイプセーフ)であり、型の整合性はコンパイル時にチェックされます。これにより、実行時エラー(ClassCastExceptionなど)を未然に防ぐことができます。また、データ型をクラスやインターフェースに対してパラメータとして渡せるため、汎用性の高い再利用可能なコードを書くことが可能です。型の互換性チ