2011-09-12 7 views
81

私はこれがLINQのあることを知っている:LinqかLambdaですか?

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つの一見同一の技術がありますか?

技術的な理由がありますか?

+2

訂正:http://www.lambdaexpression.net/ –

答えて

112

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

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

また、これは、LINQ(メソッドの構文を使用して)です:

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

それは、both of these flavorsはまったく同じ生産終わるだろうことに注意することは興味深いですコード。コンパイラは、望む方法であなたの希望を表現できるようにすることで、サービスを提供します。あなたがメソッドの構文を使用することを選択した場合は、LINQは、ほとんど常にラムダ式の周りに見られている

x => x.Value == 1 

そしてこのはラムダです。しかし、LINQlambdasはまったく異なる2つのもので、どちらも単独で使用できます。

アップデート:当然の指摘としてsvick、クエリ構文とLINQもは先に述べたように、コンパイラは、クエリ構文で記述することができます(ラムダ式を使用して実装ですが、効果的にあなたの後ろにメソッドの構文にそれを変換)。これは、両方のフレーバーが完全に等価であり、同じように動作するという事実を載せています(例えば、ラムダ式によってclosuresが作成される可能性があります)。

+2

私は、クエリー構文が裏でラムダを使用していることに言及する価値はあると思います。これは閉鎖のために重要である。 – svick

+0

@スウィック:確かに、答えは更新されました。 – Jon

30

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

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

これらの2つの構文の違いは純粋に構文的です。メソッド呼び出しを使用する2番目のlinqスタイルは、それがどのようにして動作するかです。最初は、よりユーザーフレンドリーであることを意図しています。コンパイラは、背後でメソッド呼び出しに変換します。彼らは任意の特定のクエリに対して同じように動作するはずですが、もちろん、コンパイラは、複雑なlinqクエリをslqthly異なる解釈をメソッドスタイルに変換するときよりも選択することがあります。

このmsdnの記事も参考になるかもしれません:LINQ Query Syntax versus Method Syntax。特に関連性が高いのは、「一般的には、クエリの構文が一般的にシンプルで読みやすくなるためですが、メソッドの構文とクエリの構文に意味的な違いはありません」。

+1

+1(MSDN推奨) –

+4

個人的には、メソッドの構文がわかりやすくなっています。おそらく、私のコードのほとんどが「LINQ to Objects」のバラエティであるためです。しかし、多くのSQLエクスペリエンスを持っているなら、最初はクエリ構文がわかりやすいでしょう。 –

+0

@Tom Bushell、JOIN構文ですか?真剣に? –

関連する問題