形参列表=>函数体
函数体多于一条语句的可用大括号括起。
可以将此表达式分配给委托类型,如下所示:
1
2
3
<code>delegate</code><code>int</code><code>del(</code><code>int</code><code>i);</code>
<code>del myDelegate = x => { </code><code>return</code><code>x * x; };</code>
<code>int</code><code>j = myDelegate(5); </code><code>//j = 25</code>
创建表达式目录树类型:
<code>using</code><code>System.Linq.Expressions;</code>
<code>// ...</code>
<code>Expression<del> = x => x * x;</code>
Lambda 用在基于方法的 LINQ 查询中,作为诸如 Where 和 Where 等标准查询运算符方法的参数。
使用基于方法的语法在 Enumerable 类中调用 Where 方法时(像在 LINQ to Objects 和 LINQ to XML 中那样),参数是委托类型 System..::.Func<(Of <(T, TResult>)>)。使用 Lambda 表达式创建委托最为方便。例如,当您在 System.Linq..::.Queryable 类中调用相同的方法时(像在 LINQ to SQL 中那样),则参数类型是 System.Linq.Expressions..::.Expression<Func>,其中 Func 是包含至多五个输入参数的任何 Func 委托。同样,Lambda 表达式只是一种用于构造表达式目录树的非常简练的方式。尽管事实上通过 Lambda 创建的对象的类型是不同的,但 Lambda 使得 Where 调用看起来类似。
在 is 或 as 运算符的左侧不允许使用 Lambda。
Lambda 表达式无法从封闭方法中直接捕获 ref 或 out 参数。
Lambda 表达式中的返回语句不会导致封闭方法返回。
<code>string</code><code>[] names = { </code><code>"agen"</code><code>, </code><code>"balen"</code><code>, </code><code>"coure"</code><code>, </code><code>"apple"</code><code>};</code>
<code>string</code><code>[] findNameA = Array.FindAll<</code><code>string</code><code>>(names, </code><code>delegate</code><code>(</code><code>string</code><code>v) { </code><code>return</code><code>v.StartsWith(</code><code>"a"</code><code>); });</code>
<code>string</code><code>[] findNameB = Array.FindAll<</code><code>string</code><code>>(names, v => v.StartsWith(</code><code>"a"</code><code>));</code>
上面中两个FindAll方法的反编译代码如下:
<code>string</code><code>[] findNameA = Array.FindAll<</code><code>string</code><code>>(names, </code><code>delegate</code><code>(</code><code>string</code><code>v) { </code><code>return</code><code>v.StartsWith(</code><code>"a"</code><code>); } );</code>
<code>string</code><code>[] findNameB = Array.FindAll<</code><code>string</code><code>>(names, </code><code>delegate</code><code>(</code><code>string</code><code>v) { </code><code>return</code><code>v.StartsWith(</code><code>"a"</code><code>); } );</code>
Lambda表达式的语法格式:
参数列表 => 语句或语句块
其中“参数列”中可包含任意个参数(与委托对应),如果参数列中有0个或1个以上参数,则必须使用括号括住参数列,如下:
() => Console.Write("0个参数")
I => Console.Write("1个参数时参数列中可省略括号,值为:{0}",i)
(x,y) => Console.Write("包含2个参数,值为:{0}*{1}",x,y)
而“语句或语句块”中如果只有一条语句,则可以不用大括号括住否则则必须使用,如下:
I => Console.Write("只有一条语句")
I => { Console.Write("使用大括号的表达式"); }
//两条语句时必须要大括号
I => { i++;Console.Write("两条语句的情况"); }
“Lambda表达式”是委托的实现方法,所以必须遵循以下规则:
1)“Lambda表达式”的参数数量必须和“委托”的参数数量相同;
例子:
4
5
6
7
8
9
10
11
12
13
14
15
<code>class</code><code>Test</code>
<code>{</code>
<code></code><code>delegate</code><code>int</code><code>AddHandler(</code><code>int</code><code>x, </code><code>int</code><code>y);</code>
<code></code><code>static</code><code>void</code><code>Print(AddHandler add)</code>
<code></code><code>{</code>
<code></code><code>Console.Write(add(1, 3));</code>
<code></code><code>}</code>
<code></code><code>static</code><code>void</code><code>Main()</code>
<code></code><code>Print( (x, y) => x + y );</code>
<code></code><code>Print( (x, y) => { </code><code>int</code><code>v = x * 10; </code><code>return</code><code>y + v; } );</code>
<code></code><code>Console.Read();</code>
<code>}</code>
3)如果“委托”有返回类型,则“Lambda表达式”的“语句或语句块”中也必须返回相同类型的数据;
16
17
18
19
20
<code></code><code>delegate</code><code>T AddHandler<T>(T x, T y);</code>
<code></code><code>static</code><code>void</code><code>Print(AddHandler<</code><code>int</code><code>> test)</code>
<code></code><code>Console.WriteLine(</code><code>"int type:{0}"</code><code>, test(1, 2));</code>
<code></code><code>static</code><code>void</code><code>Print(AddHandler<</code><code>double</code><code>> test)</code>
<code></code><code>Console.WriteLine(</code><code>"double type:{0}"</code><code>, test(1d, 2d));</code>
在以下方法或属性之间的调用不明确:
“ConsoleApplication1.Test.Print(ConsoleApplication1.Test.AddHandler<int>)”和“ConsoleApplication1.Test.Print(ConsoleApplication1.Test.AddHandler<double>)”
<code>Print( (</code><code>int</code><code>x, </code><code>int</code><code>y) => x + y );</code>
这样我们的代码就能编译通过了。
本文转自 我不会抽烟 51CTO博客,原文链接:http://blog.51cto.com/zhouhongyu1989/1369083,如需转载请自行联系原作者