国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C# Lambda表達式

2019-11-17 01:32:43
字體:
來源:轉載
供稿:網友

C# Lambda表達式

"Lambda表達式"是一個匿名函數,是一種高效的類似于函數式編程的表達式,Lambda簡化了開發中需要編寫的代碼量。它可以包含表達式和語句,并且可用于創建委托或表達式目錄樹類型,支持帶有可綁定到委托或表達式樹的輸入參數的內聯表達式。所有Lambda表達式都使用Lambda運算符=>,該運算符讀作"goes to"。Lambda運算符的左邊是輸入參數(如果有),右邊是表達式或語句塊。Lambda表達式x => x * x讀作"x goes to x times x"。可以將此表達式分配給委托類型,如下所示:

  1. delegateintdel(inti);
  2. delmyDelegate=x=>x*x;
  3. intj=myDelegate(5);//j=25

Lambda表達式Lambda表達式是由.NET 2.0演化而來的,也是LINQ的基礎,熟練地掌握Lambda表達式能夠快速地上手LINQ應用開發。

Lambda表達式在一定程度上就是匿名方法的另一種表現形式。為了方便對Lambda表達式的解釋,首先需要創建一個People類,示例代碼如下。

  1. publicclassPeople
  2. {
  3. publicintage{get;set;}//設置屬性
  4. publicstringname{get;set;}//設置屬性
  5. publicPeople(intage,stringname)//設置屬性(構造函數構造)
  6. {
  7. this.age=age;//初始化屬性值age
  8. this.name=name;//初始化屬性值name
  9. }
  10. }

上述代碼定義了一個People類,并包含一個默認的構造函數能夠為People對象進行年齡和名字的初始化。在應用程序設計中,很多情況下需要創建對象的集合,創建對象的集合有利于對對象進行搜索操作和排序等操作,以便在集合中篩選相應的對象。使用List進行泛型編程,可以創建一個對象的集合,示例代碼如下。

  1. List<People>people=newList<People>();//創建泛型對象
  2. Peoplep1=newPeople(21,"guojing");//創建一個對象
  3. Peoplep2=newPeople(21,"wujunmin");//創建一個對象
  4. Peoplep3=newPeople(20,"muqing");//創建一個對象
  5. Peoplep4=newPeople(23,"lupan");//創建一個對象
  6. people.Add(p1);//添加一個對象
  7. people.Add(p2);//添加一個對象
  8. people.Add(p3);//添加一個對象
  9. people.Add(p4);//添加一個對象

上述代碼創建了4個對象,這4個對象分別初始化了年齡和名字,并添加到List列表中。當應用程序需要對列表中的對象進行篩選時,例如需要篩選年齡大于20歲的人,就需要從列表中篩選,示例代碼如下。

  1. //匿名方法
  2. IEnumerable<People>results=people.Where(delegate(Peoplep){returnp.age>20;});

上述代碼通過使用IEnumerable接口創建了一個result集合,并且該集合中填充的是年齡大于20的People對象。細心的讀者能夠發現在這里使用了一個匿名方法進行篩選,因為該方法沒有名稱,通過使用People類對象的age字段進行篩選。

雖然上述代碼中執行了篩選操作,但是,使用匿名方法往往不太容易理解和閱讀,而Lambda表達式則更加容易理解和閱讀,示例代碼如下。

  1. IEnumerable<People>results=people.Where(People=>People.age>20);

上述代碼同樣返回了一個People對象的集合給變量results,但是,其編寫的方法更加容易閱讀,從這里可以看出Lambda表達式在編寫的格式上和匿名方法非常相似。其實,當編譯器開始編譯并運行時,Lambda表達式最終也表現為匿名方法。

使用匿名方法并不是創建了沒有名稱的方法,實際上編譯器會創建一個方法,這個方法對于開發人員來說是不可見的,該方法會將People類的對象中符合p.age>20的對象返回并填充到集合中。相同地,使用Lambda表達式,當編譯器編譯時,Lambda表達式同樣會被編譯成一個匿名方法進行相應的操作,但是與匿名方法相比,Lambda表達式更容易閱讀,Lambda表達式的格式如下。

  1. (參數列表)=>表達式或語句塊

上述代碼中,參數列表就是People類,表達式或語句塊就是People.age>20,使用Lambda表達式能夠讓人很容易地理解該語句究竟是如何執行的,雖然匿名方法提供了同樣的功能,卻不容易被理解。相比之下,People => People.age > 20卻能夠很好地理解為"返回一個年紀大于20的人"。其實,Lambda表達式并沒有什么高深的技術,Lambda表達式可以看作是匿名方法的另一種表現形式。Lambda表達式經過反編譯后,與匿名方法并沒有什么區別。

比較Lambda表達式和匿名方法,在匿名方法中,"("、")"內是方法的參數的集合,這就對應了Lambda表達式中的"(參數列表)",而匿名方法中"{"、"}"內是方法的語句塊,這對應了Lambda表達式中"=>"符號右邊的表達式或語句塊項。Lambda表達式也包含一些基本的格式,這些基本格式如下。

Lambda表達式可以有多個參數、一個參數,或者沒有參數。其參數類型可以隱式或者顯式。示例代碼如下:

  1. (x,y)=>x*y//多參數,隱式類型=>表達式
  2. x=>x*5//單參數,隱式類型=>表達式
  3. x=>{returnx*5;}//單參數,隱式類型=>語句塊
  4. (intx)=>x*5//單參數,顯式類型=>表達式
  5. (intx)=>{returnx*5;}//單參數,顯式類型=>語句塊
  6. ()=>Console.WriteLine()//無參數

上述格式都是Lambda表達式的合法格式,在編寫Lambda表達式時,可以忽略參數的類型,因為編譯器能夠根據上下文直接推斷參數的類型,示例代碼如下。

  1. (x,y)=>x+y//多參數,隱式類型=>表達式

Lambda表達式的主體可以是表達式也可以是語句塊,這樣就節約了代碼的編寫。

【例2-5】傳統方法,匿名方法和Lamdba表達式對比。

(1) 創建控制臺應用程序LamdbaPRictice。

(2) 在程序中添加3個函數,這3個函數分別使用傳統的委托調用、使用匿名方法和Lamdba表達式方法完成同一功能,對比有什么不同。代碼如下:

  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.Linq;
  4. usingSystem.Text;
  5. namespaceLambdaDemo
  6. {
  7. classProgram
  8. {
  9. staticvoidMain(string[]args)
  10. {
  11. Console.WriteLine("傳統的委托代碼示例:");
  12. FindListDelegate();
  13. Console.Write("/n");
  14. Console.WriteLine("使用匿名方法的示例:");
  15. FindListAnonymousMethod();
  16. Console.Write("/n");
  17. Console.WriteLine("使用Lambda的示例:");
  18. FindListLambdaExpression();
  19. }
  20. //傳統的調用委托的示例
  21. staticvoidFindListDelegate()
  22. {
  23. //先創建一個泛型的List類
  24. List<string>list=newList<string>();
  25. list.AddRange(newstring[]{"asp.net課程","J2EE課程","php課程","數據結構課程"});
  26. Predicate<string>findPredicate=newPredicate<string>(IsBookCategory);
  27. List<string>bookCategory=list.FindAll(findPredicate);
  28. foreach(stringstrinbookCategory)
  29. {
  30. Console.WriteLine("{0}/t",str);
  31. }
  32. }
  33. //謂詞方法,這個方法將被傳遞給FindAll方法進行書書籍分類的判斷
  34. staticboolIsBookCategory(stringstr)
  35. {
  36. returnstr.EndsWith("課程")?true:false;
  37. }
  38. //使用匿名方法來進行搜索過程
  39. staticvoidFindListAnonymousMethod()
  40. {
  41. //先創建一個泛型的List類
  42. List<string>list=newList<string>();
  43. list.AddRange(newstring[]{"ASP.NET課程","J2EE課程","PHP課程","數據結構課程"});
  44. //在這里,使用匿名方法直接為委托創建一個代碼塊,而不用去創建單獨的方法
  45. List<string>bookCategory=list.FindAll
  46. (delegate(stringstr)
  47. {
  48. returnstr.EndsWith("課程")?true:false;
  49. }
  50. );
  51. foreach(stringstrinbookCategory)
  52. {
  53. Console.WriteLine("{0}/t",str);
  54. }
  55. }
  56. //使用Lambda來實現搜索過程
  57. staticvoidFindListLambdaExpression()
  58. {
  59. //先創建一個泛型的List類
  60. List<string>list=newList<string>();
  61. list.AddRange(newstring[]{"ASP.NET課程","J2EE課程","PHP課程","數據結構課程"});
  62. //在這里,使用了Lambda來創建一個委托方法
  63. List<string>bookCategory=list.FindAll((stringstr)=>str.EndsWith("課程"));
  64. foreach(stringstrinbookCategory)
  65. {
  66. Console.WriteLine("{0}/t",str);
  67. }
  68. }
  69. }
  70. }

程序的運行結果如圖2-7所示。

圖2-7 運行結果

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 淅川县| 礼泉县| 遂平县| 图木舒克市| 双城市| 博野县| 定结县| 米易县| 白水县| 和田市| 江口县| 年辖:市辖区| 星座| 乌鲁木齐市| 泰兴市| 广宗县| 郓城县| 眉山市| 常德市| 元氏县| 永济市| 呼伦贝尔市| 锡林郭勒盟| 肥城市| 彰化县| 全椒县| 肇东市| 肥东县| 星座| 通州区| 浮梁县| 平遥县| 逊克县| 吴江市| 新晃| 江门市| 凉山| 会宁县| 唐海县| 关岭| 仪征市|