22

上記のタイトルの用語が適切かどうかわかりません。

と同じようab

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);

それぞれをいつ使用する必要がありますか?違いはありますか?

4

5 に答える 5

22

なし。クエリ式はメソッド式にコンパイルされます。

LINQ でのクエリ構文とメソッド構文 (C#)

クエリは IEnumerable を返すため、メソッド呼び出しを連鎖させてメソッド構文でクエリを構成します。これは、 クエリ構文を使用してクエリを記述するときにコンパイラがバックグラウンドで行うことです。

参照: LINQ クエリ式 (C# プログラミング ガイド)

コンパイル時に、C# 仕様で規定されている規則に従って、クエリ式が標準クエリ演算子メソッド呼び出しに変換されます。クエリ構文を使用して表現できるクエリは、メソッド構文を使用して表現することもできます。ただし、ほとんどの場合、クエリ構文の方が読みやすく簡潔です。詳細については、「C# 言語仕様」および「標準クエリ演算子の概要」を参照してください。

それとは別に、クエリ式で実行できないことを見つけた 1 つの場所は、アイテムと共にインデックスを取得することです。たとえば、メソッド構文で次のことができます。

var result = list.Select((r,i) => new { value = r, index = i});

クエリ式では、この目的を達成するために外部変数を定義する必要があります。これは、 Jon Skeet からの回答を含む同様の議論です。

于 2013-03-28T09:13:57.200 に答える
6

いいえ

それらの間に違いはありません。

からQuery Syntax and Method Syntax in LINQ

クエリは IEnumerable を返すため、メソッド呼び出しを連鎖させてメソッド構文でクエリを構成します。これは、クエリ構文を使用してクエリを記述するときに、コンパイラがバックグラウンドで行うことです。また、クエリ変数にはクエリの結果が格納されないため、実行後でもいつでも変更したり、新しいクエリのベースとして使用したりできます。

からもLINQ Query Expressions

コンパイル時に、クエリ式は標準クエリ演算子メソッド呼び出しに変換されます。

于 2013-03-28T09:16:57.590 に答える
3

クエリ式は、コンパイラによって標準のメソッド呼び出しに変換されます。

var a = from l in list
        where l % 2 == 0
        select l;

var b = list.Where(l => l % 2 == 0);

これら 2 つは、コンパイルされたコードではまったく同じです。

ただし、すべてのメソッドがクエリ式の構文に関連付けられたキーワードを持っているわけではありません。

于 2013-03-28T09:14:48.623 に答える
1

違いはありません、それは個人的な好みの問題です。必要に応じて、2 つのスタイルを混在させることもできます。

Linq キーワードは、C# コンパイラによってメソッド呼び出し構文に変換されます。

于 2013-03-28T09:15:09.473 に答える
1

実際、違いはありません。
実際、コンパイラが $a$ の式を $b$ の式と同等の式に変換することを除いて、これはまったく同じものです。

于 2013-03-28T12:23:54.053 に答える