web-dev-qa-db-ja.com

LinqまたはLambdaですか?

私はこれがLinqであることを知っています:

var _Results = from item in _List
                where item.Value == 1
                select item;

そして、私はこれがラムダであることを知っています:

var _Results = _List.Where(x => x.Value == 1);

編集者のメモ:上記は単にラムダではなく、述語がラムダである「メソッド構文」を使用したLinqです。明確にするために、上記のサンプルは両方ともLinqです(元の投稿は間違っていましたが、質問を促す混乱を説明するためにエラーを残しました)。

しかし、LinqはLambdaのサブセットですか?

一見同一の技術が2つあるのはなぜですか?

どちらかを選択する技術的な理由はありますか?

96

これはLINQ(クエリ構文を使用)です:

var _Results = from item in _List
                where item.Value == 1
                select item;

これもLINQです(メソッド構文を使用):

var _Results = _List.Where(x => x.Value == 1);

これらのフレーバーの両方 がまったく同じコードを生成することに注意してください。コンパイラは、希望する方法で希望を表現できるようにすることで、サービスを提供します。

そしてthisはラムダです:

x => x.Value == 1

メソッド構文の使用を選択すると、ほとんどの場合、ラムダ式の周りにLINQが表示されます。しかし [〜#〜] linq [〜#〜]lambdas はまったく異なる2つのもので、どちらも単独で使用できます。

更新:svickが正しく指摘しているように、クエリ構文を使用したLINQはalsoラムダ式(as前述のように、コンパイラはクエリ構文を記述することを可能にしますが、それを背後でメソッド構文に効果的に変換します)。これは、両方のフレーバーが完全に同等であり、同じように動作するという事実に基づいています(例えば、ラムダ式により closures が作成される場合があります)。

125
Jon

どちらもLinqです。 2番目はusingLambdas です。

ラムダは、2番目の例のWhere関数にパラメーターとして渡すインラインメソッドタイプです。

これら2つの構文の違いは、純粋に構文的なものです。メソッド呼び出しを使用する2番目のlinqスタイルは、内部でどのように機能するかです。 1つ目は、よりユーザーフレンドリー/簡単にすることを意図しており、コンパイラはそれを舞台裏でメソッド呼び出しに変換します。もちろん、コンパイラはメソッドスタイルに変換するときよりも複雑なlinqクエリの厳密に異なる解釈を選択する可能性がありますが、どのクエリでも同じように動作するはずです。

このmsdnの記事も興味深いかもしれません: LINQクエリ構文vsメソッド構文 。特定の関連性は次のとおりです。「一般に、クエリシンタックスをお勧めします。通常、クエリシンタックスはシンプルで読みやすいためです。ただし、メソッドシンタックスとクエリシンタックスには意味的な違いはありません。」

34
Chris