新聞中心
Linq有很多值得學習的地方,這里我們主要介紹Lambda表達式和Linq查詢,包括介紹Filter方法等方面。

公司主營業(yè)務:網(wǎng)站設計制作、成都做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出三門免費做網(wǎng)站回饋大家。
Lambda表達式和Linq查詢
接下來我們通過一個例子來看一下Lambda表達式和Linq查詢的關系:我們現(xiàn)在想給ClassCollection增加一個過濾方法,方法的目的是能夠過濾返回班級名稱為“終極一班”的集合來。
1.首先給MyExtention增加這么一個靜態(tài)方法:
- public static ClassCollection Filter(this ClassCollection classes)
- {
- var newnewlist = new ClassCollection();
- foreach (var item in classes)
- {
- if (item.Name=="終極一班")
- {
- newlist.Add(item);
- }
- }
- return newlist;
- }
- private static void LambdaLinq()
- {
- var classes = GetClasses();
- //var students = GetStudents();
- //0 原始版本
- var result = classes.Filter();
- foreach (var item in result)
- }
- Console.WriteLine(item.ID+ " " + item.Name);
- }
- }
- //相關的工廠方法:
- static ClassCollection GetClasses()
- {
- return new ClassCollection{
- new Class(1){ Name = "終極一班"},
- new Class(2){ Name = "終極二班"},
- };
- }
2.現(xiàn)在需求發(fā)生了變化,需要上面的紅色部分需要發(fā)生變化,也就是說我們希望這個查詢條件可以在我們調用Filter方法的時候動態(tài)的指定,這時候我們可以把這個變化封裝成一個接口,當然還可以封裝成一個委托,這是.net的非常好用的獨有特性,委托的最直接的作用可以把一個具體的方法引用封裝成一個變量傳遞。好,開始變形!
- delegate bool FilterHandler(Class c);
- //注意這個要放到namespace下面,不要放到Program類里面
- public static ClassCollection Filter(this ClassCollection classes,FilterHandler f)
- {
- var newnewlist = new ClassCollection();
- foreach (var item in classes)
- {
- if (f(item))
- {
- newlist.Add(item);
- }
- }
- return newlist;
- }
- static bool F(Class c)
- {
- return c.Name == "終極一班";
- }
- private static void LambdaLinq()
- {
- var classes = GetClasses();
- // C#1.0 使用委托封裝過濾條件
- FilterHandler f=new FilterHandler(F);
- var result = classes.Filter(f);
- foreach (var item in result)
- {
- Console.WriteLine(item.ID+ " " + item.Name);
- }
- }
我們聲明了一個委托FilterHandler,只要滿足這個委托的方法我們都可以傳遞給Filter方法,這樣就實現(xiàn)了動態(tài)的改變查詢條件的目的,F(xiàn)方法內部可以是任意的查詢條件比如return c.Name != "終極一班";同時我們不需要改變Filter方法內部穩(wěn)定的部分。
3.c#2.0里面也支持直接把一個方法傳給一個委托,但本質上也是編譯器把方法轉換成了一個委托,例如上面:
- private static void LambdaLinq()
- {
- var classes = GetClasses();
- // C#2.0 直接傳遞方法
- var result = classes.Filter(F);
- foreach (var item in result)
- {
- Console.WriteLine(item.ID+ " " + item.Name);
- }
- }
4.C#2.0里面有個新特性,叫匿名方法,我們可以直接傳遞匿名方法:
- private static void LambdaLinq()
- {
- var classes = GetClasses();
- // C#2.0 傳遞匿名方法
- var result = classes.Filter(delegate(Class c) { return c.Name == "終極一班"; });
- foreach (var item in result)
- {
- Console.WriteLine(item.ID+ " " + item.Name);
- }
- }
好,變形到這里,我們發(fā)現(xiàn)這個匿名其實不僅僅可以給我們帶來不用給方法命名的好處,在這個方法內部我們還可以使用外部上下文環(huán)境的變量成員,這個特性也叫“閉包(Closure)”,JavaScript也支持這個特性,比如:
- private static void LambdaLinq()
- {
- var classes = GetClasses();
- string className = "終極一班";
- // C#2.0 傳遞匿名方法
- var result = classes.Filter(delegate(Class c) { return c.Name == className; });
- foreach (var item in result)
- {
- Console.WriteLine(item.ID+ " " + item.Name);
- }
- }
以上介紹Lambda表達式和Linq查詢。
網(wǎng)站名稱:Lambda表達式和Linq查詢淺析
URL分享:http://m.fisionsoft.com.cn/article/cdigpgd.html


咨詢
建站咨詢
