上記のタイトルの用語が適切かどうかわかりません。
と同じようa
にb
:
var list = Enumerable.Range(0, 100);
var a = from l in list
where l % 2 == 0
select l;
var b = list.Where(l => l % 2 == 0);
それぞれをいつ使用する必要がありますか?違いはありますか?
なし。クエリ式はメソッド式にコンパイルされます。
クエリは IEnumerable を返すため、メソッド呼び出しを連鎖させてメソッド構文でクエリを構成します。これは、 クエリ構文を使用してクエリを記述するときにコンパイラがバックグラウンドで行うことです。
参照: LINQ クエリ式 (C# プログラミング ガイド)
コンパイル時に、C# 仕様で規定されている規則に従って、クエリ式が標準クエリ演算子メソッド呼び出しに変換されます。クエリ構文を使用して表現できるクエリは、メソッド構文を使用して表現することもできます。ただし、ほとんどの場合、クエリ構文の方が読みやすく簡潔です。詳細については、「C# 言語仕様」および「標準クエリ演算子の概要」を参照してください。
それとは別に、クエリ式で実行できないことを見つけた 1 つの場所は、アイテムと共にインデックスを取得することです。たとえば、メソッド構文で次のことができます。
var result = list.Select((r,i) => new { value = r, index = i});
クエリ式では、この目的を達成するために外部変数を定義する必要があります。これは、 Jon Skeet からの回答を含む同様の議論です。
それらの間に違いはありません。
からQuery Syntax and Method Syntax in LINQ
クエリは IEnumerable を返すため、メソッド呼び出しを連鎖させてメソッド構文でクエリを構成します。これは、クエリ構文を使用してクエリを記述するときに、コンパイラがバックグラウンドで行うことです。また、クエリ変数にはクエリの結果が格納されないため、実行後でもいつでも変更したり、新しいクエリのベースとして使用したりできます。
コンパイル時に、クエリ式は標準クエリ演算子メソッド呼び出しに変換されます。
クエリ式は、コンパイラによって標準のメソッド呼び出しに変換されます。
var a = from l in list
where l % 2 == 0
select l;
var b = list.Where(l => l % 2 == 0);
これら 2 つは、コンパイルされたコードではまったく同じです。
ただし、すべてのメソッドがクエリ式の構文に関連付けられたキーワードを持っているわけではありません。
違いはありません、それは個人的な好みの問題です。必要に応じて、2 つのスタイルを混在させることもできます。
Linq キーワードは、C# コンパイラによってメソッド呼び出し構文に変換されます。
実際、違いはありません。
実際、コンパイラが $a$ の式を $b$ の式と同等の式に変換することを除いて、これはまったく同じものです。