自C#3.0開始,就可以使用一種新語法把實現(xiàn)代碼賦予委托:Lambda表達(dá)式。只要有委托參數(shù)類型的地方,就可以使用Lambda表達(dá)式。
沙市網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,沙市網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為沙市1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務(wù)好的沙市做網(wǎng)站的公司定做!
Lambda表達(dá)式的語法比匿名方法簡單。如果所調(diào)用的方法有參數(shù),且不需要參數(shù),匿名方法的語法就比較簡單,因為這樣不需要提供參數(shù)。
直接上一些例子,讀者可以自行運(yùn)行調(diào)試。
static void Main(string[] args) { //1、lambda之hello world. Func<string, string> lambda = param => { return param; }; Console.WriteLine(lambda("hello lambda.")); //2、lambda之參數(shù) Func<double, double, double, double> cube = (double x, double y, double z) => x * y * z; Console.WriteLine(cube(1, 2, 3));//輸出6 //更進(jìn)一步,參數(shù)的類型可以省略 Func<double, double, double, double> cude1 = (x, y, z) => x * y * z; Console.WriteLine(cude1(2, 4, 6));//輸出48 //3、lambda之調(diào)用外部參數(shù) int someValue = 4; Func<double, double, double, double> f = (x, y, z) => x + y + z + someValue; Console.WriteLine(f(1, 2, 3));//1+2+3+4=10 }
在winform編程中,我們經(jīng)常給某個按鈕添加Click事件,最原始的寫法是直接雙擊按鈕,生成Click事件的代碼,我們就可以直接在里面寫方法了。其實這是vs替我們做了很多工作,其中就有在designer.cs文件中,生成了 this.button1.Click += new System.EventHandler(this.button1_Click);這樣的代碼,事件要注冊才能觸發(fā)。
我們采用匿名委托的寫法,在窗體的Form_Load事件中添加如下代碼,則可以觸發(fā)button1的Click事件。
this.button1.Click += delegate(object ss, EventArgs ee) { MessageBox.Show("hello,this is button1.Click event..."); };
再看看Lambda表達(dá)式的用法。
this.button1.Click += (ss, ee) => { MessageBox.Show("hello,this is button1.Click event..."); };
是不是更加簡潔?
我們再看一下,從匿名方法到Lambda簡寫的演化過程,借一張圖。
從這個演化過程,可以看出C#語言的發(fā)展變化過程。
下面詳細(xì)演示一下Lambda的應(yīng)用實例。
首先第一個實例我們應(yīng)用Lambda對一個List<Student>列表進(jìn)行循環(huán)、查找、排序等操作。
首先我們提供一個實體類:
public class Student { public Student(string name, int age) { this.Name = name; this.Age = age; } public string Name { get; set; } public int Age { get; set; } }
然后我們初始化一個List,
//初始化3個Student對象 var students = new List<Student>() { new Student("zhang3",18), new Student("li4",22), new Student("wang5",20) };
//定義1個打印函數(shù) Action<Student> print = student => Console.WriteLine(string.Concat(student.Name, ":", student.Age));
那么,我們就可以先循環(huán)輸出一下:
students.ForEach(print);//循環(huán)打印輸出
如果我們要找到年齡大于20歲的學(xué)生,可以這樣:
students.FindAll(student => student.Age > 20).ForEach(print);
進(jìn)一步,我們按照學(xué)生的年齡進(jìn)行排序:
students.Sort((f1, f2) => f1.Age.CompareTo(f2.Age)); students.ForEach(print);//年齡從小到大排序后輸出
現(xiàn)在,我們按照在students列表里再加一個學(xué)生:
var students = new List<Student>() { new Student("zhang3",18), new Student("li4",22), new Student("wang5",20), new Student("zhao6",20) };
現(xiàn)在要按照年齡進(jìn)行分組,并統(tǒng)計出各個年齡階段的人數(shù):
var result = students.GroupBy(x => x.Age).Select(x => string.Concat(x.Key, ":", x.Count()));//先進(jìn)行分組,再進(jìn)行投影 result.ToList().ForEach(x => Console.WriteLine(x.ToString()));//循環(huán)輸出得到結(jié)果
再提供一個綜合性的例子,這是論壇里的caozhy版主提供的一個例子。用Lambda表達(dá)式實現(xiàn)快速排序。
Func<Func<int, int, bool>, Func<int[], int[]>> filter = x => new Func<int[], int[]>(y => y.Skip(1).Where(z => x(y[0], z)).ToArray()); Func<int[], int[]> qsort = x => x; Func<int[], int[]> lesser = dt => filter((x, y) => y < x)(dt); Func<int[], int[]> greater = dt => filter((x, y) => y >= x)(dt); qsort = dt => dt.Length > 1 ? qsort(lesser(dt)).Concat(new int[] { dt[0] }).Concat(qsort(greater(dt))).ToArray() : dt; int[] data = { 4, 3, 1, 4, 6, 7, 5, 9, 3, 11, 1, 2, 11 }; var result = qsort(data); result.ToList().ForEach(x => Console.WriteLine(x.ToString()));//排完序后輸出
最后提供一下官方的C# Lambda表達(dá)式的權(quán)威資料。C# Lambda表達(dá)式
標(biāo)題名稱:C#Lambda表達(dá)式
新聞來源:http://m.newbst.com/article38/gdcgpp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、品牌網(wǎng)站制作、網(wǎng)站收錄、小程序開發(fā)、網(wǎng)站排名、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)