天天看點

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,如需轉載請自行聯系原作者

繼續閱讀