それはLinqまたはLambdaですか?


105

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

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

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

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

編集者注:上記は単なるLambdaではなく、述語がLambdaである「メソッド構文」を使用するLinqです。明確にするために、上記のサンプルはどちらもLinqです(私の元の投稿は正しくありませんでしたが、質問を促す混乱を説明するためにエラーを残しました)。

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

一見同じように見える技術が2つあるのはなぜですか?

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


回答:


135

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

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

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

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

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

そしてこれはラムダです:

x => x.Value == 1

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

更新: svickが正しく指摘しているように、クエリ構文を使用したLINQ ラムダ式を使用して実装されています(前述のように、コンパイラーを使用すると、クエリ構文を記述できますが、背後でメソッド構文に効率的に変換できます)。これは、両方のフレーバーが完全に等価であり、同じように動作するという事実を積み重ねたものです(たとえば、ラムダ式によってクロージャーが作成される場合があります)。


2
クエリ構文では舞台裏でもラムダを使用していることは言及する価値があると思います。閉鎖のため、これは重要な場合があります。
スビック

34

どちらもLinqです。2つ目はLambdas を使用して ます。

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

これら2つの構文の違いは、構文のみです。メソッド呼び出しを使用する2番目のlinqスタイルは、内部でどのように機能するかです。1つ目はよりユーザーフレンドリーで簡単なものであり、コンパイラーはそれを舞台裏でメソッド呼び出しに変換します。もちろん、コンパイラーはメソッドスタイルに変換する場合とは異なり、複雑なlinqクエリの解釈が少し異なる場合がありますが、どのクエリでも同じように機能するはずです。

このmsdnの記事も興味深いかもしれません:LINQクエリ構文とメソッド構文。「通常、クエリ構文はよりシンプルで読みやすいため、一般的にはクエリ構文をお勧めしますが、メソッド構文とクエリ構文の間に意味上の違いはありません。」


6
個人的には、メソッド構文の方が読みやすいと思います。おそらく、私のコードのほとんどが「LINQ to Objects」の種類であるためです。ただし、SQLの経験が豊富な場合は、クエリ構文の方が最初は理解しやすいでしょう。
トムブッシェル2011

@トム・ブッシェル、JOIN構文も?マジ?
ジェリーニクソン

@トム・ブシェル:私も。そのMSDNページで、メソッドスタイルだけでなく、なぜ構文を開発するのが面倒なのかを説明しているものを言い換えました。私は通常、結合や他のより複雑なもの(つまり、ほとんどの場合フィルタリングまたは1対1のマッピング操作)ではなく、比較的基本的なことを行っています。
クリス

@Jerry-Chrisのように、私のLINQ作業はこれまでかなり単純です。SelectMany、Join、またはGroupJoinを実行するときは通常、クエリ構文が望ましいと読みました-そのようなことをする必要はありません-まだ!
Tom Bushell、2011

1
内部的には、 "クエリ構文"はLINQ to SQLおよびLINQ to Entitiesチームでは "理解構文"と呼ばれていました。
DamienG 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.