天天看点

C# 关于Lambda表达式

形参列表=>函数体

函数体多于一条语句的可用大括号括起。

可以将此表达式分配给委托类型,如下所示:

1

2

3

<code>delegate</code><code>int</code><code>del(</code><code>int</code><code>i);</code>

<code>del myDelegate = x =&gt; { </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&lt;del&gt; = x =&gt; x * x;</code>

Lambda 用在基于方法的 LINQ 查询中,作为诸如 Where 和 Where 等标准查询运算符方法的参数。

使用基于方法的语法在 Enumerable 类中调用 Where 方法时(像在 LINQ to Objects 和 LINQ to XML 中那样),参数是委托类型 System..::.Func&lt;(Of &lt;(T, TResult&gt;)&gt;)。使用 Lambda 表达式创建委托最为方便。例如,当您在 System.Linq..::.Queryable 类中调用相同的方法时(像在 LINQ to SQL 中那样),则参数类型是 System.Linq.Expressions..::.Expression&lt;Func&gt;,其中 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&lt;</code><code>string</code><code>&gt;(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&lt;</code><code>string</code><code>&gt;(names, v =&gt; v.StartsWith(</code><code>"a"</code><code>));</code>

上面中两个FindAll方法的反编译代码如下:

<code>string</code><code>[] findNameA = Array.FindAll&lt;</code><code>string</code><code>&gt;(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&lt;</code><code>string</code><code>&gt;(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表达式的语法格式:

参数列表 =&gt; 语句或语句块

其中“参数列”中可包含任意个参数(与委托对应),如果参数列中有0个或1个以上参数,则必须使用括号括住参数列,如下:

() =&gt; Console.Write("0个参数")

I =&gt; Console.Write("1个参数时参数列中可省略括号,值为:{0}",i)

(x,y) =&gt; Console.Write("包含2个参数,值为:{0}*{1}",x,y)

而“语句或语句块”中如果只有一条语句,则可以不用大括号括住否则则必须使用,如下:

I =&gt; Console.Write("只有一条语句")

I =&gt; { Console.Write("使用大括号的表达式"); }

//两条语句时必须要大括号

I =&gt; { 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) =&gt; x + y );</code>

<code></code><code>Print( (x, y) =&gt; { </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&lt;T&gt;(T x, T y);</code>

<code></code><code>static</code><code>void</code><code>Print(AddHandler&lt;</code><code>int</code><code>&gt; 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&lt;</code><code>double</code><code>&gt; test)</code>

<code></code><code>Console.WriteLine(</code><code>"double type:{0}"</code><code>, test(1d, 2d));</code>

在以下方法或属性之间的调用不明确:

“ConsoleApplication1.Test.Print(ConsoleApplication1.Test.AddHandler&lt;int&gt;)”和“ConsoleApplication1.Test.Print(ConsoleApplication1.Test.AddHandler&lt;double&gt;)”

<code>Print( (</code><code>int</code><code>x, </code><code>int</code><code>y) =&gt; x + y );</code>

这样我们的代码就能编译通过了。

本文转自 我不会抽烟 51CTO博客,原文链接:http://blog.51cto.com/zhouhongyu1989/1369083,如需转载请自行联系原作者