Linq Lambda表達(dá)式概括
在向大家詳細(xì)介紹Linq之前,首先讓大家了解下Linq Lambda表達(dá)式,以后全面介紹Linq。
Linq Lambda表達(dá)式
接下來我們通過一個(gè)例子來看一下Linq Lambda表達(dá)式:我們現(xiàn)在想給ClassCollection增加一個(gè)過濾方法,方法的目的是能夠過濾返回班級(jí)名稱為“***一班”的集合來。
1.偉大的Microsoft又給我們提供了一種更簡(jiǎn)潔的寫法,這也就是我們所說的Linq Lambda表達(dá)式了:
- private static void LambdaLinq()
- {
- var classes = GetClasses();
- string className = "***一班";
- //4 C#3.0 Lambda表達(dá)式
- var result = classes.Filter(c=> c.Name == className);
- foreach (var item in result)
- {
- Console.WriteLine(item.ID+ " " + item.Name);
- }
- }
“=>”左邊的就是我們上面匿名方法的參數(shù)列表,右邊的是方法里,實(shí)際上Linq Lambda表達(dá)式也可以寫成如下形式:
- Class c => c.Name == className
- (Class c) => c.Name == className
- (Class c) => {return c.Name == className;}
- (x,y)=>x+y;//多參數(shù)
等等,函數(shù)的返回類型也是由編譯器根據(jù)"=>"右邊的表達(dá)式自動(dòng)推斷出來的。
而且需要提到的是由于Filter是擴(kuò)展方法的緣故,而且Filter方法返回類型是ClassCollection,所以可以無限擴(kuò)展下去,例如
- var result = classes.Filter( c => c.Name == className).Filter(c=>c.ID>1);
這就是擴(kuò)展方法的魅力所在!
2.實(shí)際上不知不覺,我們已經(jīng)實(shí)現(xiàn)了Linq里面的一個(gè)Where功能了,然后會(huì)發(fā)現(xiàn)classes這個(gè)實(shí)例會(huì)增加了很多擴(kuò)展方法例如Where,OrderBy,這些方法實(shí)際上就是一些給實(shí)現(xiàn)了IEnumerable接口的類型的擴(kuò)展方法,說白了就是針對(duì)集合類型的一些相關(guān)方法,比如過濾、排序、合并、分組等方法,這些方法的返回類型依然是IEnumerable(大家可以把光標(biāo)移動(dòng)到Where方法上,然后調(diào)用“轉(zhuǎn)到定義”去看看這些方法的定義就明白了)當(dāng)然這些方法都離不開我們的Lambda表達(dá)式做參數(shù)。
- private static void LambdaLinq()
- {
- var classes = GetClasses();
- string className = "***一班";
- //5 C#3.0里面的Where擴(kuò)展方法(專門給實(shí)現(xiàn)了IEnumerable接口的類做擴(kuò)展)
- var result = classes.Where(c => c.Name == className);
- foreach (var item in result)
- {
- Console.WriteLine(item.ID+ " " + item.Name);
- }
- }
3.這樣寫針對(duì)IEnumarable類型的查詢其實(shí)已經(jīng)不錯(cuò)了,微軟覺得還不過癮,又提供了我們傳說中的Linq Lambda表達(dá)式
- private static void LambdaLinq()
- {
- var classes = GetClasses();
- string className = "***一班";
- //6 Linq查詢表達(dá)式
- var result = from c in classes where
c.Name==className orderby c.ID select c;- foreach (var item in result)
- {
- Console.WriteLine(item.ID+" "+item.Name);
- }
- }
到這時(shí)候你還認(rèn)識(shí)原來的擴(kuò)展方法嗎?所以說語言的抽象確實(shí)很好用,和人的思維很接近,但是我們還是要看到它的本質(zhì),其實(shí)它的本質(zhì)都是面向?qū)ο蟮囊恍〇|西,并沒有創(chuàng)造出一些什么新的東西來,這樣我們才可以真正理解語言。
【編輯推薦】