LINQ とジェネリック型 (C#)
LINQ クエリは、.NET Framework Version 2.0 で導入されたジェネリック型に基づいています。 クエリを作成するために、ジェネリックについての詳しい知識は必要ありません。 しかし、次の 2 つの基本的な概念を理解しておくと役立ちます。
List などのジェネリック コレクション クラスのインスタンスを作成するときは、リストに保持するオブジェクトの型で "T" を置き換えます。 たとえば、文字列のリストは List<string> で表され、Customer オブジェクトのリストは List<Customer> で表されます。 ジェネリック リストは厳密に型指定されるため、要素を Object として格納するコレクションと比べて多くの利点があります。 Customer を List<string> に追加しようとすると、コンパイル時にエラーが発生します。 実行時に型キャストを実行する必要がないため、ジェネリック コレクションを使用するのは簡単です。
IEnumerable は、foreach ステートメントを使用してジェネリック コレクション クラスを列挙できるようにするインターフェイスです。 ArrayList などの非ジェネリック コレクション クラスが IEnumerable をサポートするのと同様に、ジェネリック コレクション クラスは IEnumerable をサポートします。
ジェネリックの詳細については、「ジェネリック (C# プログラミング ガイド)」を参照してください。
LINQ クエリの IEnumerable<T> 変数
LINQ クエリ変数は、IEnumerable か、または IQueryable などの派生型として型指定されます。 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 クエリ操作での型の関係 (C#)」を参照してください。
コンパイラによるジェネリック型の宣言の処理
必要に応じて、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 を使用すると、他の開発者にとってコードが読みにくくなる可能性があることを理解しておいてください。 詳細については、「暗黙的に型指定されるローカル変数 (C# プログラミング ガイド)」を参照してください。