53

私は C# と MVC の初心者で、匿名メソッドや LINQ など、特定の機会にラムダを使用しました。

通常、次のようなラムダ式を目にします。

(x => x.Name), (x => { Console.WriteLine(x))

lambda = "gos to" であることは理解しています。左のパラメーターが使用されていないラムダ式を見たことがありません。

このラムダ式を翻訳する方法がわかりませんが

@Html.DisplayFor(modelItem => item.FirstName)

誰かが私のためにこれに光を当てることができますか? これはいけませんか

(modelItem => modelItem.FirstName)?

これは、Microsoft のASP.NET MVC チュートリアルの紹介から取得しました。

4

4 に答える 4

103

ラムダ式は無名関数、つまり名前のない関数を書く方法です。「矢印」の左側にあるのが関数のパラメータで、右側にあるのが関数本体です。したがって、(x => x.Name)論理的にstring Function(Data x) { return x.Name }はタイプのようなものに変換されstringData明らかに変化し、コンテキストから派生します。

左側のパラメーターがないことは、パラメーターのない関数に変換されるため、これは(() => someVariable)論理的に次のように変換されます。string Function() { return someVariable; }

この時点で、どこsomeVariableから来たのか疑問に思うかもしれませんが、これは関数パラメーターではなく、関数で定義されていません。あなたは正しいでしょう、このような関数は決してコンパイルされません。ただし、このようなラムダ関数は、外部スコープの変数をこのように持ち上げて使用できるため、まったく問題ありません。(内部的に、ラムダ式で使用される変数がフィールドになるラッパー クラスが作成されます。)

では、どういうmodel => item.FirstName意味か見てみましょう。論理的には に変換されstring Function(Model model) { return item.FirstName; }ます。基本的にこれはパラメータを持つ関数ですが、このパラメータは使用されません。

では、最後の情報です。ラムダ式は最終的には関数を表しますが、実際に実行されることを目的として作成されていない場合があります (可能性はありますが)。ラムダ式は、式ツリーの形式で表すことができます。これは、実行する代わりに解析できることを意味します。

この特定のケースでは、MVC エンジンは、ラムダ式が表す関数を実行しません。代わりに、MVC エンジンがこの特定の行に対して出力する html を認識できるように、式が解析されます。データ項目がモデル オブジェクトから直接取得されていない場合、ラムダ式の左側の部分は重要ではありません。

于 2012-04-11T00:20:42.663 に答える
7

foreachループについてだと思います。例:

@foreach(var item in model) 
{ 
 <td> 
     @html.displayfor(model => item.firstName) </td>
 </td>     
}

var itemシーケンス内の各アイテムは匿名タイプであるため、使用する必要があります。 model => item.firstNameを意味し(input parameter) => expressionます。現在の「アイテム」はに格納されているため、入力パラメータを使用することはできませんitem

于 2012-04-11T00:25:25.307 に答える
5

パラメータなしのラムダダを使用しています。この質問を参照してください

基本的に、DisplayFor はラムダ関数のパラメーター モデルを使用せず (use _ または () を使用すると言うものなら何でもかまいません)、for ループ内でラムダ関数を使用してそれに対して displayfor を使用します。DisplayFor にはラムダ関数が必要です。

于 2012-04-10T23:48:39.927 に答える