自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Lambda表達(dá)式和Linq查詢淺析

開發(fā) 后端
這里介紹Lambda表達(dá)式和Linq查詢,我們現(xiàn)在想給ClassCollection增加一個(gè)過濾方法,方法的目的是能夠過濾返回班級(jí)名稱為“終極一班”的集合來。

Linq有很多值得學(xué)習(xí)的地方,這里我們主要介紹Lambda表達(dá)式和Linq查詢,包括介紹Filter方法等方面。

Lambda表達(dá)式和Linq查詢

接下來我們通過一個(gè)例子來看一下Lambda表達(dá)式和Linq查詢的關(guān)系:我們現(xiàn)在想給ClassCollection增加一個(gè)過濾方法,方法的目的是能夠過濾返回班級(jí)名稱為“終極一班”的集合來。

1.首先給MyExtention增加這么一個(gè)靜態(tài)方法:

  1. public static ClassCollection Filter(this ClassCollection classes)  
  2. {  
  3. var newnewlist = new ClassCollection();  
  4. foreach (var item in classes)  
  5. {  
  6. if (item.Name=="終極一班")  
  7.  
  8. {  
  9. newlist.Add(item);  
  10. }  
  11. }  
  12. return newlist;  
  13. }  
  14.  
  15. private static void LambdaLinq()  
  16. {  
  17. var classes = GetClasses();  
  18. //var students = GetStudents();  
  19. //0 原始版本  
  20. var result = classes.Filter();  
  21. foreach (var item in result)  
  22. }  
  23. Console.WriteLine(item.ID+ " " + item.Name);  
  24. }  
  25.  
  26. }  
  27.  
  28. //相關(guān)的工廠方法:  
  29.  
  30. static ClassCollection GetClasses()  
  31. {  
  32. return new ClassCollection{  
  33. new Class(1){ Name = "終極一班"},  
  34. new Class(2){ Name = "終極二班"},  
  35. };  
  36. }  

2.現(xiàn)在需求發(fā)生了變化,需要上面的紅色部分需要發(fā)生變化,也就是說我們希望這個(gè)查詢條件可以在我們調(diào)用Filter方法的時(shí)候動(dòng)態(tài)的指定,這時(shí)候我們可以把這個(gè)變化封裝成一個(gè)接口,當(dāng)然還可以封裝成一個(gè)委托,這是.net的非常好用的獨(dú)有特性,委托的最直接的作用可以把一個(gè)具體的方法引用封裝成一個(gè)變量傳遞。好,開始變形!

  1. delegate bool FilterHandler(Class c);   
  2. //注意這個(gè)要放到namespace下面,不要放到Program類里面  
  3.  
  4. public static ClassCollection Filter(this ClassCollection classes,FilterHandler f)  
  5. {  
  6. var newnewlist = new ClassCollection();  
  7. foreach (var item in classes)  
  8. {  
  9. if (f(item))  
  10.  
  11. {  
  12. newlist.Add(item);  
  13. }  
  14. }  
  15. return newlist;  
  16. }  
  17.  
  18. static bool F(Class c)  
  19. {  
  20. return c.Name == "終極一班";  
  21. }  
  22.  
  23. private static void LambdaLinq()  
  24. {  
  25. var classes = GetClasses();  
  26. // C#1.0 使用委托封裝過濾條件  
  27. FilterHandler f=new FilterHandler(F);  
  28. var result = classes.Filter(f);  
  29. foreach (var item in result)  
  30. {  
  31. Console.WriteLine(item.ID+ " " + item.Name);  
  32. }  
  33.  
  34. }

我們聲明了一個(gè)委托FilterHandler,只要滿足這個(gè)委托的方法我們都可以傳遞給Filter方法,這樣就實(shí)現(xiàn)了動(dòng)態(tài)的改變查詢條件的目的,F(xiàn)方法內(nèi)部可以是任意的查詢條件比如return c.Name != "終極一班";同時(shí)我們不需要改變Filter方法內(nèi)部穩(wěn)定的部分。

3.c#2.0里面也支持直接把一個(gè)方法傳給一個(gè)委托,但本質(zhì)上也是編譯器把方法轉(zhuǎn)換成了一個(gè)委托,例如上面:

  1. private static void LambdaLinq()  
  2. {  
  3. var classes = GetClasses();  
  4. // C#2.0 直接傳遞方法  
  5. var result = classes.Filter(F);  
  6. foreach (var item in result)  
  7. {  
  8. Console.WriteLine(item.ID+ " " + item.Name);  
  9. }  
  10.  
  11. }  

4.C#2.0里面有個(gè)新特性,叫匿名方法,我們可以直接傳遞匿名方法:

  1. private static void LambdaLinq()  
  2. {  
  3. var classes = GetClasses();  
  4. // C#2.0 傳遞匿名方法  
  5. var result = classes.Filter(delegate(Class c) { return c.Name == "終極一班"; });  
  6. foreach (var item in result)  
  7. {  
  8. Console.WriteLine(item.ID+ " " + item.Name);  
  9. }  
  10.  
  11. }  

好,變形到這里,我們發(fā)現(xiàn)這個(gè)匿名其實(shí)不僅僅可以給我們帶來不用給方法命名的好處,在這個(gè)方法內(nèi)部我們還可以使用外部上下文環(huán)境的變量成員,這個(gè)特性也叫“閉包(Closure)”,JavaScript也支持這個(gè)特性,比如:

  1. private static void LambdaLinq()  
  2. {  
  3. var classes = GetClasses();   
  4.  
  5. string className = "終極一班";  
  6. // C#2.0 傳遞匿名方法  
  7.  
  8. var result = classes.Filter(delegate(Class c) { return c.Name == className; });  
  9. foreach (var item in result)  
  10. {  
  11. Console.WriteLine(item.ID+ " " + item.Name);  
  12. }  
  13.  
  14. }  

以上介紹Lambda表達(dá)式和Linq查詢。

【編輯推薦】

  1. LINQ to SQL查詢分析
  2. LINQ查詢架構(gòu)簡(jiǎn)單介紹
  3. LINQ to SQL映射關(guān)系概述
  4. LINQ To SQL對(duì)象模型淺析
  5. LINQ to SQL映射列描述
責(zé)任編輯:佚名 來源: IT168
相關(guān)推薦

2009-09-09 13:01:33

LINQ Lambda

2009-09-15 15:18:00

Linq Lambda

2009-09-11 09:48:27

Linq Lambda

2009-09-09 17:45:07

Linq表達(dá)式

2009-09-17 10:40:22

Linq Lambda

2009-09-15 17:30:00

Linq Lambda

2009-09-17 09:44:54

Linq Lambda

2009-09-09 17:14:17

Linq lambda

2009-09-10 15:35:07

LINQ查詢表達(dá)式

2011-10-28 16:34:13

LINQ

2009-08-27 09:13:28

LINQ查詢表達(dá)式

2009-09-07 17:18:33

LINQ查詢表達(dá)式

2009-09-11 09:53:16

Linq查詢表達(dá)式

2009-09-17 11:08:55

LINQ查詢表達(dá)式

2009-09-11 12:32:33

LINQ表達(dá)式

2009-09-17 14:21:19

LINQ表達(dá)式

2022-12-05 09:31:51

接口lambda表達(dá)式

2009-06-12 09:44:04

LINQ查詢復(fù)合from子句

2009-08-10 17:11:34

.NET 3.5擴(kuò)展方Lambda表達(dá)式

2009-09-17 09:15:49

Linq表達(dá)式樹
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)