lambda表達式在很多語言中應用,lambda表達式可以當作委托中的一種變形,委托的構建方便編程人員能夠在程序中傳入函數,相當於回掉函數。
lambda表達式可以方便的構造匿名函數,如果代碼中里面存有大量小的功能函數,而這些函數只被調用一次,不妨將他們重構成lambda表達式。比如需要計算a+b,那么一般思路初始化,然后計算。lambda表達式可以直接賦值計算。關鍵讓人看的簡潔,明白這一段代碼是完成一個功能。Lambda表達式為編寫匿名方法提供了更簡明的函數式的句法,但結果卻在編寫LINQ查詢表達式時變得極其有用,因為它們提供了一個非常緊湊的而且類安全的方式來編寫可以當作參數來傳遞,在以后作運算的函數。所以在對數據庫操作時,lambda應用很廣。
lambda運算符:所有的lambda表達式都是使用新的lambda運算符“=》”,讓人理解為“轉到”。運算符將表達式分成兩部分:左邊指定輸入參數,右邊是lambda主體表達式。
lambda表達式:
1 一個參數:para=》expr
2 多個表達式:(para1,para2)=》expr。
前面講過lambda表達式是委托執行的變異體,先有委托,然后才可以在聲明對象時,直接執行lambda表達式。
func委托
T是一種參數類型,可以聲明類型,也可以直接這樣寫。
多個參數,前面的參數,最后一個是返回值的類型,這個是必須有的啊。
下面我們分析下。
public class Person { public string name { get; set; } public int Age { get; set; } </span> //聲明個person類 } public static class test1 { //擴展方法是一種特殊的靜態方法,但可以像擴展類型上的實例方法一樣進行調用。 //擴展方法被定義為靜態方法,但它們是通過實例方法語法進行調用的。 它們的第一個參數指定該方法作用於哪個類型,並且該參數以 this 修飾符為前綴。 //擴展方法的要求如下: //1 第一個參數是要擴展或者要操作的類型,這稱為"被擴展的類型" //2 為了指定擴展方法,要在被擴展的類型名稱前面附加this修飾符 //3 要將方法作為一個擴展方法來訪問,要用using指令導入擴展類型的命名空間,或者使擴展類型和調用代碼在同一個命名空間中. public static IEnumerable<T> testwhere<T>(this IEnumerable<T> souces, Func<T, bool> predica) { foreach (T item in souces) { if (predica(item)) { //yield計算表達式並以枚舉數對象值的形式返回;返回值必須可以隱式轉換為迭代器的 yield 類型。 yield return item; } } } } class Program { public static List<Person> PersonList() {//加載person類 List<Person> persons = new List<Person>(); for (int i = 1; i < 10;i++ ) { persons.Add(new Person(){name = i+ "erzi",Age = i,}); } return persons; } //用於委托到lambda變形 delegate int Addsum(int a, int b); static void Main(string[] args) { List<Person> personlist = PersonList(); //where括號中需要傳入func函數,這個lambda也可以自己寫 //personlist = personlist.Where(p => p.Age > 2).ToList(); List<Person> personlist2 = PersonList(); personlist2 = test1.testwhere(personlist2, p => p.Age > 3).ToList();//測試生成數據 Person[] personarray = personlist.Where(p => p.Age < 7).ToArray(); Person per = personlist.SingleOrDefault(p => p.Age == 6); //lambda表達式用之前需要委托,之后在其應用lambda表達式 Addsum count = (i,j) => i + j; foreach (Person temp in personlist2) { Console.WriteLine(temp.name); } foreach (Person temp in personarray) { Console.WriteLine(temp.name); } Console.ReadKey(); } }
C#里,一個lambda表達式在句法上是寫成一個參數列表,隨后是 => 符號,隨后是表達式在調用時要運算的表達式或者語句塊所以,當我們編寫這樣的lambda表達式時:我們是想表示,我們在定義的Lambda接受一個參數p,要運行的代碼表達式返回p.LastName的值是否等於“Guthrie”。 我們將參數命名為p是不相干的,我也可以很容易地將其命名為o,x,foo,或者我想要的任何名字。不象匿名方法要求參數類型是明確地指明的,Lambda表達式允許省略參數類型,而允許它們根據用法來推斷出類型。譬如,當我編寫 p=>p.LastName == "Guthrie" 這個lambda表達式時,編譯器推斷出p參數屬於Person類型,因為當前的Where擴展方法的對象是個范型的List<Person>集合。Lambda參數的類型可以在編譯時和被Visual Studio的intellisense引擎推斷出來,這意味着在編寫lambda時你將獲得完全的intellisense 和編譯時檢查。譬如,注意當我在下面健入 p. 時,Visual Studio Orcas是如何提供intellisense完成的,因為它知道 p 是 Person類型:
其實針對lambda應用中,類似這種func委托一個用廣的,比如在異步委托中。針對控件中我們常常需要加載信息,此處應該用異步,所以在控件上應用異步時需要應用Invoke。此函數需要傳入委托。
1. (一)Action和Fun兩個委托的不同點:
Action只能委托必須是無返回值的方法
Fun只是委托必須有返回值的方法
泛型委托Action這里指多個類型參數
Action委托:只能委托無返回值(void)的方法。
(2)可以使用此委托以參數形式傳遞方法,而不用顯式聲明自定義的委托
泛型委托Func委托,這里可以有一個或多個或者沒有參數T,但必須有返回值並返回 TResult 參數所指定的類型的值
(1)必須有指定參數返回值。
2)Lambda 表達式的基礎類型是泛型 Func 委托之一。 這樣能以參數形式傳遞 lambda 表達式,而不用顯式將其分配給委托。
(3)因為 System.Linq 命名空間中許多類型方法具有 Func 參數,因此可以給這些方法傳遞 lambda 表達式,而不用顯式實例化 Func 委托。
