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