2011-02-22 16 views
7

ラムダ式を使用する必要がありますか?LINQを使用するかラムダ式をオプションにする必要がありますか?ラムダ式の構文

ラムダ式では、符号=>が常に使用されます。どういう意味ですか?

customers.Where(c => c.City == "London"); 

ここではc =>が使用されますが、それはなぜですか? c =>を使用した場合、どのような意味がありますか。私はラムダを知らないので詳細に議論してください。

答えて

7

ラムダ式

c => c.City == "London" 

bool IsCustomerInLondon(Customer c) 
{ 
    return (c.City == "London"); 
} 

それが値を返す単純な関数を書くだけの非常に簡潔な方法だようなものの省略形です。これは決して名前や正式な定義が割り当てられていないので、「無名関数」と呼ばれます(パラメータ型と戻り型はコンテキストから推論されます)。

(実際には、それだけで速記ではありません;。ラムダ式は非常にクールかつ強力なツールですclosuresと呼ばれるいくつかの他の構造に関連している)

+0

ラムダ式は式ツリーに変換することもできます。 –

11

いいえ、にはラムダ式を使用するがありません。たとえば、あなたのWhere例を書くことができますように:もちろん、オブジェクトにLINQを想定しています

private static bool IsLondon(Customer customer) 
{ 
    return customer.City == "London"; 
} 

... 

var londoners = customers.Where(IsLondon); 

。 LINQ to SQLなどでは、式ツリーを構築する必要があります。

ラムダ式では常に "=>"が使用されているのは、それが演算子の書き方であるからです。なぜなら、加算に "+"が使用された理由を尋ねるのと同じです。

「C => ...」が効果的にこのような場合、一般的な型推論に...ラムダ式にc呼ばパラメータを与えているのラムダ式はタイプcを提供します。本体は、実行するアクションか、cに基づく値を返す何らかの計算を提供します。

ラムダ式の完全な説明は、この回答の範囲外です。しかし、my bookのためのまばゆいプラグとして、C#の第9章で詳しく説明しています。

+0

私はちょうど私の前で編集しました:p – TimothyP

1

ラムダとLINQはかなり別のものです。あなたが他を使用せずに1を使用することができます(そこラムダ式に依存してLINQの部分がありますが、我々はそれを簡単な:-)を維持したい)

ラムダ式は式を含めることができ、匿名 機能です ステートメントを使用して、 デリゲートまたは式ツリーを作成するために使用することができます 種類。

これはMSDNのものです。 (http://msdn.microsoft.com/en-us/library/bb397687)。aspx)

ラムダ式を使ってローカル関数を作ることができます(もっと複雑です)。 =>(あなたの例ではc)の前に置くものは、関数のパラメータになります。戻り値の型はC#コンパイラによって "発見"されます。

c => c.City == "London"はほぼ同等である:

delegate (TheObjectTypeOfC c) { 
    return c.City == London 
}; 

(差は、いくつかのラムダ式は、デリゲートとも表現されているが、これを無視してください、あなたはいくつかの時間のためにそれを必要としないということです)

コンパイラがパラメータの型を推論できない場合は、強制的にそれを実行することができます:(MyObject p) => p.SomeProperty != null。ここでは、pがパラメータであることをコンパイラに伝えています。

ここで私はあなたにも、「ステートメントラムダ」を行うことができ、「発現ラムダ」と呼ばれている何を示したが:

p => { 
    for (int i = 0; i < 10; i++) { 
     if (p.SomeProperty == 0) { 
      return true; 
     } 
    } 

    return false; 
} 

を(私は間の「舞台裏」の違いは何を教えてくれません。式lambdasとステートメントlambdas。それらを知りたい場合は、前に指摘したmsdnページを参照してください)

+0

LINQの一部であるクエリ式の変換がラムダ式に依存するという点で、完全に*分離されているわけではありません。ただし、ラムダ式を使用せずにLINQライブラリを使用することができます。 –

1

Jonはすでに答えました。 ですが、これを追加したいと思います。あなたが与えている例では

、LINQのは、すべての顧客をループ想像し、 、cは単に列挙内の各項目への参照です:

var result = new List<Customer>(); 
foreach(var c in customers) 
{ 
    if (c.City == "London") 
     result.Add(c); 
} 
return result; 

それは他のどのような変数だ、それはありません。単一の名前のものになるように、 しかし、それはちょうど何らかの種類の規則です。

1

Lqlnq to sqlまたはEntitiesでラムダ式を使用する必要はありません。ここであなたのコードの代替方法です。

あなたコード:

customers.Where(c => c.City == "London"); 

他の方法。

var query = from cs in customers 
       where cs.City == "London" 
       select cs; 

これは別の方法です。それはあなた次第です。

4

lambdaを関数の匿名とみなしてください。 次のコードで説明しようとします。

public bool IsLondon(Customer customer) 
{ 
    return customer.City == "London"; 
} 

今、私たちは関数名をダウンストリップと括弧を取り除く:コンパイラは式から種類を推定することができるので

public bool Customer customer  
    return customer.City == "London"; 

我々は、戻り値の型を必要としない:

customer.City == "London"; 

同じように、コンパイラは入力の型を知っているので、それを指定する必要はありません。

だから基本的には、私たちがして、左は

customer 
    return customer.City == "London"; 

であり、C#でのラムダ構文は、基本的には次のとおりです。

(parameter list) => "expression" 

あなたはまた、「マルチライン」の式を書くことができますが、その後あなたが持っています中括弧でコードを囲みます。また、通常と同じように、 "return"ステートメントを使用する必要があります。

1

いいえ、まったく必要ありません。

LINQクエリを書くには2通りの方法があります。

1つはクエリメソッドで、もう1つはビルダーメソッドです。ビルダーメソッドの場合は、ラムダ式を入れるだけです。例えば 、我々は70 以上のマークを持っているいくつかの学生オブジェクトからすべてのこれらの学生を見つけたいが、我々は、構文

var data = from p in stdList 
    where p.marks > 70 
    select p; 

または VARデータ= stdList.Where以下でLINQでこのことを行うことができれば(p => p.marks> 70)。

laterアプローチはbuilderメソッドです。Where関数では、ラムダ式を渡しています。

ラムダ式は、常にLINQクエリを使用することができますが、単純な条件を適用するだけで全体のクエリ構文を避けたい場合は、ラムダ式のLINQビルダメソッド(Lambda式を要求します)式では、常にエイリアスを定義して操作を実行します。

=>演算子に関しては、代入演算子と同様に動作します。たとえば :

(p) => p.Gender == “F” 
It means “All persons p, such that person’s Gender is F” 

は、いくつかの文献では、これは、「述語」と呼ばれています。別の文献用語は「投影」である。

(p) => p.Gender ? “F” : “Female” 
“Each person p becomes string “Female” if Gender is “F”” 

これは投影法であり、3値演算子を使用する。 私は非常に基本的な例で説明しましたが、これがあなたに役立つことを願っています。 。 。 :)