LINQ とジェネリック型 (C#)

LINQ クエリは、.NET Framework のバージョン 2.0 で導入されたジェネリック型に基づいています。 クエリを記述するために、ジェネリックについて詳しく知っておく必要ありません。 ただし、次の 2 つの基本的な概念を理解しておくと役立ちます。

  1. List<T> などのジェネリック コレクション クラスのインスタンスを作成するときに、リストに保持されるオブジェクトの型で "T" を置き換えます。 たとえば、文字列のリストは List<string> で表され、Customerオブジェクトのリストは List<Customer> で表されます。 ジェネリック リストは厳密に型指定されるため、要素を Object として格納するコレクションと比べて多くの利点があります。 CustomerList<string> に追加しようとすると、コンパイル時にエラーが発生します。 実行時に型キャストを実行する必要がないため、ジェネリック コレクションを使用するのは簡単です。

  2. IEnumerable<T> は、foreach ステートメントを使用してジェネリック コレクションのクラスを列挙できるようにするインターフェイスです。 ArrayList などの非ジェネリック コレクション クラスが IEnumerable をサポートするように、ジェネリック コレクション クラスは、IEnumerable<T> をサポートします。

ジェネリックの詳細については、「ジェネリック」を参照してください。

LINQ クエリの IEnumerable<T> 変数

LINQ クエリ変数は、IEnumerable<T>、または IQueryable<T> などの派生型として型指定されます。 IEnumerable<Customer> として型指定されたクエリ変数が見つかった場合は、クエリが実行されたときに 0 個以上の Customer オブジェクトのシーケンスが作成されることを意味します。

IEnumerable<Customer> customerQuery =
    from cust in customers
    where cust.City == "London"
    select cust;

foreach (Customer customer in customerQuery)
{
    Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}

詳細については、「LINQ クエリ操作での型の関係」を参照してください。

コンパイラによるジェネリック型の宣言の処理

必要に応じて、var キーワードを使用することにより、ジェネリックの構文を回避することもできます。 var キーワードは、from 句で指定されたデータ ソースを調べてクエリ変数の型を推論するようにコンパイラに指示します。 次の例では、前の例と同じコンパイル済みのコードが生成されます。

var customerQuery2 =
    from cust in customers
    where cust.City == "London"
    select cust;

foreach(var customer in customerQuery2)
{
    Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}

var キーワードは、変数の型が明らかな場合、または入れ子にされたジェネリック型 (グループ クエリで生成されたものなど) を明示的に指定する必要がない場合に便利です。 一般に、var を使用すると、他の開発者にとってコードが読みにくくなる可能性があることを理解しておくことをお勧めします。 詳細については、「暗黙的に型指定されるローカル変数」を参照してください。

関連項目