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

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


咨詢(xún)
建站咨詢(xún)
