Linq教程之Lambda表示式
匿名方法
匿名方法顧名思義,是沒有名字的方法,但是仍有方法體,仍能幹活。在很多地方可能你都見過它,比如js中,用的最多!
看看Msdn給的說法:
在 2.0 之前的 C# 版本中,宣告委託的唯一方法是使用命名方法。 C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表示式取代了匿名方法,作為編寫內聯程式碼的首選方式。 不過,本主題中有關匿名方法的資訊同樣也適用於 Lambda 表示式。 有一種情況下,匿名方法提供了 Lambda 表示式中所沒有的功能。 您可使用匿名方法來忽略引數列表。 這意味著匿名方法可轉換為具有各種簽名的委託。 這對於 Lambda 表示式來說是不可能的。
一個例子
namespace Wolfy.LinqDemo { /// <summary> /// 建立一個委託Del /// </summary> /// <param name="x">引數</param> public delegate void Del(int x); class Program { static void Main(string[] args) { //使用匿名方法建立一個委託物件d Del d = delegate(int x) { Console.WriteLine(x); }; } } }
通過使用匿名方法,由於您不必建立單獨的方法,因此減少了例項化委託所需的編碼系統開銷。
例如,執行緒類即可建立一個執行緒並且包含該執行緒執行的程式碼。
Thread thread = new Thread( delegate() { //方法體 Console.WriteLine("Hello world"); });
可以更直白的這樣理解,如果該方法就使用那麼一次,那麼就可以使用匿名方法。
Lambda
定義
Lambda 表示式是一種可用於建立委託或表示式目錄樹型別的匿名函式。
若要建立 Lambda 表示式,需要在 Lambda 運算子 => 左側指定輸入引數(如果有),然後在另一側輸入表示式或語句塊。
一個例子
/// <summary> /// 建立一個委託Del /// </summary> /// <param name="x">引數</param> public delegate void Del(int x); class Program { static void Main(string[] args) { Del del = x => Console.WriteLine(x * x); del(2);//4 Console.Read(); } }
若要建立表示式目錄樹,可以這樣:
/// <summary> /// 建立一個委託Del /// </summary> /// <param name="x">引數</param> public delegate void Del(int x); class Program { static void Main(string[] args) { Del del = x => Console.WriteLine(x * x); del(2);//4 System.Linq.Expressions.Expression<Del> expression = x => Console.WriteLine(x); Console.Read(); } }
上面的例子建立了一個表示式目錄樹物件expression,由於Del委託是沒有返回值的,這裡是將其直接輸出。
表示式Lambda
表示式位於 => 運算子右側的 lambda 表示式稱為“表示式 lambda”。表示式 lambda 會返回表示式的結果,並採用以下基本形式:
(input parameters) => expression
注意:僅當 lambda 只有一個輸入引數時,括號才是可選的;否則括號是必需的。 括號內的兩個或更多輸入引數使用逗號加以分隔:
(x, y) => x == y
//有時,編譯器難以或無法推斷輸入型別。 如果出現這種情況,你可以按以下示例中所示方式顯式指定型別 (int x, string s) => s.Length > x //使用空括號指定零個輸入引數 () => SomeMethod()
語句Lambda
語句 lambda 與表示式 lambda 表示式類似,只是語句括在大括號中
(input parameters) => {statement;}
statement(語句Lambda)可以包含任意數量的語句,但通常不會多於兩個或三個。
一個例子
namespace Wolfy.LinqDemo { /// <summary> /// 建立一個委託Del /// </summary> /// <param name="x">引數</param> public delegate void Del(string strName); class Program { static void Main(string[] args) { Del d = x => { string s = "Hello" + " " + x; Console.WriteLine(s); }; d("wolfy"); Console.Read(); } } }
注意
像匿名方法一樣,語句 lambda 也不能用於建立表示式目錄樹
總結
這裡對Lambda及匿名方法做了一個簡單介紹。雖然在專案中也經常使用,但是對Lambda的基礎知識,還是需要補一補。
相關文章
- C# Lambda表示式和linq表示式 之 匿名物件查詢接收C#物件
- lambda 表示式
- lambda表示式
- C# 中使用Linq和Lambda表示式對List進行排序C#排序
- Java | Lambda表示式Java
- Lambda表示式(Java)Java
- java lambda 表示式Java
- 八,Lambda表示式
- Java Lambda表示式Java
- [轉]Java 8 的 lambda 表示式 Java 8 的 lambda 表示式Java
- Lambda、Linq
- C# Lambda表示式詳解,及Lambda表示式樹的建立C#
- 淺談lambda表示式
- Lambda表示式詳解
- Java之lambda表示式Java
- kotlin lambda表示式Kotlin
- Python - lambda 表示式Python
- Lambda表示式總結
- Java的Lambda表示式Java
- Java 8 Lambda 表示式Java
- C++Lambda表示式C++
- java 8 lambda表示式Java
- Java Lambda 表示式初探Java
- Python Lambda 表示式Python
- 【Kotlin】Lambda表示式Kotlin
- C#lambda表示式C#
- cpp的lambda表示式
- Java 基礎 —— Lambda 表示式Java
- Lambda 表示式的應用
- lambda表示式——快速入門
- c++之lambda表示式C++
- Java 中的 Lambda 表示式Java
- Java lambda表示式基本使用Java
- Java8-Lambda表示式Java
- java8 lambda表示式Java
- 「C++11」Lambda 表示式C++
- 掌握 Java 8 Lambda 表示式Java
- Java筆記:Lambda表示式Java筆記