




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、lambda簡(jiǎn)介 lambda運(yùn)算符:所有的lambda表達(dá)式都是用新的lambda運(yùn)算符 " => ",可以叫他,“轉(zhuǎn)到”或者 “成為”。運(yùn)算符將表達(dá)式分為兩部分,左邊指定輸入?yún)?shù),右邊是lambda的主體。 lambda表達(dá)式: 1.一個(gè)參數(shù):param=>expr
2、 2.多個(gè)參數(shù):(param-list)=>exprLambda表達(dá)式詳細(xì)總結(jié)(一)輸入?yún)?shù)在Lambda表達(dá)式中,輸入?yún)?shù)是Lambda運(yùn)算符的左邊部分。它包含參數(shù)的數(shù)量可以為0、1或者多個(gè)。只有當(dāng)輸入?yún)?shù)為1時(shí),Lambda表達(dá)式左邊的一對(duì)小括弧才可以省略。輸入?yún)?shù)的數(shù)量大于或者等于2時(shí),Lambda表達(dá)式左邊的一對(duì)小括弧中的多個(gè)參數(shù)質(zhì)檢使用逗號(hào)(,)分割。示例1下面創(chuàng)建一個(gè)Lambda表達(dá)式,它的輸入?yún)?shù)的數(shù)量為0.該表達(dá)式將顯示“This is a Lambda expression”字符串。csharp view plain copy print?()=>Con
3、sole.WriteLine("This is a Lambda expression."); ()=>Console.WriteLine("This is a Lambda expression.");分析2 由于上述Lambda表達(dá)式的輸入?yún)?shù)的數(shù)量為0,因此,該Lambda表達(dá)式的左邊部分的一對(duì)小括弧不能被省略。示例2下面創(chuàng)建一個(gè)Lambda表達(dá)式,它的輸入?yún)?shù)包含一個(gè)參數(shù):m。該表達(dá)式將計(jì)算m參數(shù)與2的乘積。csharp view plain copy print?m=>m
4、*2; m=>m*2;分析2 上述Lambda表達(dá)式的輸入?yún)?shù)省略了一對(duì)小括弧,它與“(m)=>m*2”Lambda表達(dá)式是等效的。示例3下面創(chuàng)建一個(gè)Lambda表達(dá)式,它的輸入?yún)?shù)包含兩個(gè)參數(shù):m和n。該表達(dá)式將計(jì)算m和n參數(shù)的乘積。csharp view plain copy print?(m,n)=>m*n; (m,n)=>m*n;(二)表達(dá)式或語句塊多個(gè)Lambda表達(dá)式可以構(gòu)成Lambda語句塊。語句塊可以放到運(yùn)算符的右邊,作為Lambda的主體。根據(jù)主題不同,Lambda表達(dá)式可以分為表達(dá)式Lambda和語句Lam
5、bda。語句塊中可以包含多條語句,并且可以包含循環(huán)、方法調(diào)用和if語句等。示例1下面創(chuàng)建一個(gè)Lambda表達(dá)式,它的右邊部分是一個(gè)表達(dá)式。該表達(dá)式計(jì)算m參數(shù)的平方值。csharp view plain copy print?m=>m*n; m=>m*n;分析1 如果Lambda表達(dá)式的右邊部分是一個(gè)語句塊,那么該語句塊必須被""和""包圍。示例2下面創(chuàng)建一個(gè)Lambda表達(dá)式,它的輸入?yún)?shù)包括兩個(gè)參數(shù):m和n。該表達(dá)式的右邊包含2個(gè)表達(dá)式;第一個(gè)表達(dá)式計(jì)算m和n參數(shù)的乘積,結(jié)果保存為result變量;第二個(gè)表達(dá)式顯示re
6、sult變量的值。csharp view plain copy print?(m,n)=>int result=m*n; Console.WriteLine(result); (m,n)=>int result=m*n; Console.WriteLine(result);分析2 上述Lambda表達(dá)式的右邊部分包含2個(gè)表達(dá)式,因此,該表達(dá)式的右邊部分必須被""和""包圍。(三)查詢表達(dá)式查詢表達(dá)式是一種使用查詢語法表示的表達(dá)式,它用于查詢和轉(zhuǎn)換來自任意支持LINQ的數(shù)據(jù)源中的數(shù)據(jù)。查詢表達(dá)式使用許多
7、常見的C#語言構(gòu)造,易讀簡(jiǎn)潔,容易掌握。它由一組類似于SQL或XQuery的聲明性語法編寫的子句組成。每一個(gè)子句可以包含一個(gè)或多個(gè)C#表達(dá)式。這些C#表達(dá)式本身也可能是查詢表達(dá)式或包含查詢表達(dá)式。查詢表達(dá)式必須以from子句開頭,以select或group子句結(jié)束。第一個(gè)from子句和最后一個(gè)select子句或group子句之間,可以包含一個(gè)活多個(gè)where子句、let子句、join子 句、orderby子句和group子句,甚至還可以是from子句。它包括8個(gè)基本子句,具體說明如下所示。from子句:指定查詢操作的數(shù)據(jù)源和范圍變量。select子句:指定查詢結(jié)果的類型和表現(xiàn)形式
8、。where子句:指定篩選元素的邏輯條件。let子句:引入用來臨時(shí)保存查詢表達(dá)式中的字表達(dá)式結(jié)果的范圍變量。orderby子句:對(duì)查詢結(jié)果進(jìn)行排序操作,包括升序和降序。group子句:對(duì)查詢結(jié)果進(jìn)行分組。into子句:提供一個(gè)臨時(shí)標(biāo)識(shí)符。join子句、group子句或select子句可以通過該標(biāo)識(shí)符引用查詢操作中的中堅(jiān)結(jié)果。join子句:連接多個(gè)用于查詢操作的數(shù)據(jù)源。示例1下面創(chuàng)建一個(gè)查詢表達(dá)式query,該查詢表達(dá)式查詢arr數(shù)組中的每一個(gè)元素。intarr =new int0,1,2,3,4,5,6,7,8,9;分析1csharp view plain copy print?var
9、0;query1=from n in arr select n; var query1=from n in arr select n;示例2 下面創(chuàng)建一個(gè)查詢表達(dá)式query2.該查詢表達(dá)式查詢arr數(shù)組中大于6的元素。csharp view plain copy print?int arr =new&
10、#160;int0,1,2,3,4,5,6,7,8,9; var query2=from n in arr where n >6 s
11、elect n; int arr =new int0,1,2,3,4,5,6,7,8,9;var query2=from n in arr where n >6 select n;分析2變量只是保存查詢操作,而不是查詢的結(jié)果。當(dāng)查詢表達(dá)式執(zhí)行查詢操作時(shí),才會(huì)計(jì)算該查詢表達(dá)式的結(jié)果。以上兩個(gè)變量的類型都屬于集合類型。(四)from子句from子句用來指定查詢表達(dá)式的數(shù)據(jù)源和范圍變量。它是查詢表達(dá)式的必有部分,并且它出現(xiàn)在最開始。數(shù)據(jù)源不但可以包括查詢本身的數(shù)據(jù)源,而且還可以包括子查詢的數(shù)據(jù)源。范圍變量用來表示數(shù)據(jù)源序列中的每一個(gè)元素。注意:from子句指定的
12、數(shù)據(jù)源的類型必須為IEnumerable,IEnumerable<T>或一種派生類型。示例1下面創(chuàng)建一個(gè)查詢表達(dá)式query。該查詢表達(dá)式查詢arr數(shù)組中的每一個(gè)元素。在query查詢表達(dá)式中,arr數(shù)組為數(shù)據(jù)源,n為范圍變量。n范圍變量的類型arr數(shù)據(jù)源的元素類型。分析1 csharp view plain copy print?int arr =new int 0,1,2,3,4,5,67,8,9; var query =from n in arr
13、0; select n; int arr =new int 0,1,2,3,4,5,67,8,9;var query =from n in arr select n;下面我們來學(xué)習(xí)數(shù)據(jù)源和包含不同的from子句查詢表達(dá)式。 數(shù)據(jù)源:指定數(shù)據(jù)的來源,它的形式可以為靜態(tài)數(shù)組、動(dòng)態(tài)數(shù)組(Arraylist)、集合、數(shù)據(jù)集(DataSet)、數(shù)據(jù)表、MML片段、MML文件等。如果數(shù)據(jù)源實(shí)現(xiàn)了IEnumerable<T>接口,那么編譯器可以推斷范圍變量的類型為其元素類型。例如:數(shù)據(jù)源的類型為IEnumerable<UserInfo>,那么
14、可以推斷出范圍 變量的類型為UseInfo。示例2下面創(chuàng)建一個(gè)查詢表達(dá)式query。該查詢表達(dá)式查詢list反省數(shù)組中的每一個(gè)元素。在query查詢表達(dá)式中,list反省數(shù)組為數(shù)據(jù)源。u為范圍變量。u范圍變量的類型為list數(shù)據(jù)源的元素類型(UserInfo)。分析2csharp view plain copy print?List<UserInfo> list=. var query =from u in list &
15、#160; select u; List<UserInfo> list=.var query =from u in list select u;如果當(dāng)數(shù)據(jù)源是非泛型IEnumerable類型(如ArrayList等)時(shí),需要顯示指定范圍變量的類型。 示例3下面創(chuàng)建一個(gè)查詢表達(dá)式query。該查詢表達(dá)式查詢list數(shù)組中的每一個(gè)元素。在query查詢表達(dá)式中,list數(shù)組為數(shù)據(jù)源,u為范圍變量。u范圍變量的類型被指定為list數(shù)據(jù)源的元素類型(UserInfo)。分析3csharp view p
16、lain copy print?ArrayList list =new ArrayList(); list.Add(.); . var query =from UserInfo u in list select u; ArrayList list =new ArrayList();list.Add(.);.var query =from U
17、serInfo u in list select u;包含單個(gè)from子句的查詢表達(dá)式 在查詢表達(dá)式中,from子句至少有一個(gè)。當(dāng)from子句只有一個(gè)時(shí),構(gòu)成的查詢表達(dá)式被稱為包含單個(gè)from子句的查詢表達(dá)式。一般的,包含單個(gè)from子句的查詢表達(dá)式只包含一個(gè)數(shù)據(jù)源。示例4下面創(chuàng)建一個(gè)查詢表達(dá)式query。該查詢表達(dá)式查詢arr數(shù)組中的每一個(gè)元素,它就是一個(gè)包含單個(gè)from子句的查詢表達(dá)式。分析4csharp view plain copy print?int arr =new int0,1,12,3,4,5,6,7,8,9; var
18、0;query =from n in arr select n; int arr =new int0,1,12,3,4,5,6,7,8,9;var query =from n in arr select n;包含多個(gè)from子句的查詢表達(dá)式 在查詢表達(dá)式中,當(dāng)from子句有兩個(gè)或兩個(gè)以上時(shí),構(gòu)成的查詢表達(dá)式被稱為包含多個(gè)from子句的查詢表達(dá)式。示例5下面創(chuàng)建一個(gè)查詢表達(dá)式query。該查詢表達(dá)式包含兩個(gè)from子句,
19、他們分別查詢兩個(gè)獨(dú)立的數(shù)據(jù)源;arr1數(shù)組和arr2數(shù)組。最后,使用select子句計(jì)算當(dāng)前元素的和。分析5csharp view plain copy print?int arr1= new int 0,1,2,3,4,5,6,7,8,9; int arr2=new int 0,1,2,3,4,5,6,7,8,9; var query =from a in arr1
20、60; from b in arr2 select a +b; int arr1= new int 0,1,2,3,4,5,6,7,8,9;int arr2=new int 0,1,2,3,4,5,6,7,8,9;var query =from a in arr1 from b in arr2 select a +b;包含符合from子句的查詢表達(dá)式 在查詢表達(dá)式中,有可能查詢表達(dá)式的
21、數(shù)據(jù)源中的每一個(gè)元素本身也作為該查詢表達(dá)式的數(shù)據(jù)源。那么要查詢數(shù)據(jù)源中的每一個(gè)元素中的元素,則需要使用符合from子句。符合from子句類似于嵌套的foreach語句。示例6下面創(chuàng)建一個(gè)名稱為Test的類,該類包含兩個(gè)字段:Name和AliasName。其中,Name字段的類型為string,AliasName字段的類型為string類型列表。因此,它也可以作為子查詢表達(dá)式的數(shù)據(jù)源。分析6csharp view plain copy print?public class Test
22、Public string Name; Public List<string> AliasName; public class Test Public string Name; Public List<string> AliasName;示例7下面創(chuàng)建一個(gè)查詢表達(dá)式query。該查詢表達(dá)式包含了一個(gè)符合from子句:第一個(gè)from子句查詢list泛型集合;第二個(gè)from子句查詢list集合中元素的AliasName字
23、段,為第一個(gè)from子句的子查詢。最后,使用select子句將u變量的Name屬性的值和name變量的值拼接為一個(gè)字符串。分析7csharp view plain copy print?List<MUserInfo> list =. var query =from u in list from name in u.AliasName select u
24、.Name+name; List<MUserInfo> list =.var query =from u in list from name in u.AliasNameselect u.Name+name;(五)select子句select子句用來指定將在執(zhí)行查詢時(shí)產(chǎn)生的值的類型。查詢表達(dá)式必須以select子句或group子句結(jié)束。示例1下面創(chuàng)建一個(gè)查詢表達(dá)式query。該查詢表達(dá)式查詢arr數(shù)組中的每一個(gè)元素。分析1csharp view plain copy print?int arr =new int 0,1,
25、2,3,4,5,6,7,8,9; var query =from n in arr select n; int arr =new int 0,1,2,3,4,5,6,7,8,9;var query =from n in arr select n;示例2 下面創(chuàng)建一個(gè)查詢表達(dá)式query。該查詢表達(dá)式查詢arr數(shù)組中的每一個(gè)元素和10的乘積。csharp view plain copy p
26、rint?int arr =new int 0,1,2,3,4,5,6,7,8,9; var query =from n in arr select n*10; int arr =new int 0,1,2,3,4,5,6,7,8,9;var query =from n in arr select n*10;分析2 select子句中的“n*10”表達(dá)式?jīng)Q定了查詢結(jié)果的表
27、現(xiàn)形式,即計(jì)算每一個(gè)元素和10的乘積。示例3下面創(chuàng)建一個(gè)查詢表達(dá)式query。該查詢表達(dá)式查詢arr數(shù)組中的每一個(gè)元素,查詢結(jié)果是一個(gè)對(duì)象的集合對(duì)象包含兩個(gè)屬性:ID和Name,它在select子句中由匿名對(duì)象初始化器創(chuàng)建。每一個(gè)對(duì)象的ID屬性的值是當(dāng)前元素的值、Name屬性的值為元素的值的字符串的表現(xiàn)形式。分析3csharp view plain copy print?int arr =new int0,1,2,3,4,5,6,7,8,9; var query =from n in arr&
28、#160; select new ID=n, Name =n.ToString()
29、int arr =new int0,1,2,3,4,5,6,7,8,9;var query =from n in arr select new ID=n, Name =n.ToString() ;(六)where子句where子句用來指導(dǎo)將在查詢表達(dá)式中返回?cái)?shù)據(jù)源中的哪些元素。它將一個(gè)布爾條件應(yīng)用于數(shù)據(jù)源中的每個(gè)元素,并返回指定條件的元素。查詢表達(dá)式可以包含一個(gè)或多個(gè)where子句。示例1下面創(chuàng)建一個(gè)查詢表達(dá)式query。該查詢表達(dá)式從arr數(shù)組中查詢小于3的元素csharp view plain copy print?int arr =new int
30、0,1,2,3,4,5,6,7,8,9; var query =from n in arr where n <3 select n; int arr =new int 0,1,2,3,4,5,6,7,8,9;var query =fr
31、om n in arr where n <3 select n;分析1上述where子句只包含一個(gè)布爾表達(dá)式“n<3”,該表達(dá)式將篩選小于3的元素。在一個(gè)where子句中,也可以包含多個(gè)布爾表達(dá)式,各個(gè)表達(dá)式直接使用邏輯運(yùn)算符(如&&和|)分隔。示例2下面創(chuàng)建一個(gè)查詢表達(dá)式query。該查詢表達(dá)式從arr數(shù)組中查詢大于3且小于6的元素。csharp view plain copy print?int arr =new int0,1,2,3,4,5,6,7,8,9; var query =from
32、 n in arr where n >3 && n<6 select n; int arr
33、 =new int0,1,2,3,4,5,6,7,8,9;var query =from n in arr where n >3 && n<6 select n;分析2上述where子句包含兩個(gè)布爾表達(dá)式"n>3"和"n<6",它們共同指定將篩選大于3且小于6的元素。這兩個(gè)布爾表達(dá)式使用&&運(yùn)算符鏈接,即計(jì)算這兩個(gè)布爾表達(dá)式的邏輯與。where子句不但可以包含布爾表達(dá)式,而且還可以包含返回布爾值的方法。示例3下面創(chuàng)建一個(gè)查詢表達(dá)式query.該查詢表達(dá)式從arr數(shù)組中查詢?yōu)榕紨?shù)的元素。csharp
34、view plain copy print?int arr =new int0,1,2,3,4,5,6,7,8,9; private bool IsEven(int i) return i%2=0?true:false; var query =from n in arr
35、 wehre IsEven(n) select n; int arr =new int0,1,2,3,4,5,6,7,8,9;private bool IsEven(int i) return i%2=0?true:false
36、;var query =from n in arr wehre IsEven(n) select n;分析3上述where子句包含一個(gè)返回布爾值的方法"IsEven(int i)"。該方法判定元素是否為偶數(shù)。如果是,則返回true,否則返回false。(七)let子句let子句用來創(chuàng)建一個(gè)新的范圍變量,它用于存儲(chǔ)子表達(dá)式的結(jié)果。let子句使用編程者提供的表達(dá)式的結(jié)果初始化該變量。一旦初始化了該范圍變量的值,它就不能用于存儲(chǔ)其他的值。示例1下面創(chuàng)建一個(gè)查詢表達(dá)式query。該查詢表達(dá)式從arr數(shù)組中查詢?yōu)榕紨?shù)的元素。csharp view plain copy print?i
37、nt arr =new int0,1,2,3,4,5,6,7,8,9; var query =from n in arr let isEven =return n%2=0?true:false; where isEven&
38、#160; select n; int arr =new int0,1,2,3,4,5,6,7,8,9;var query =from n in arr let isEven =return n%2=0?true:false; where isEven select n;分析1"return n%2=0?true:false"表達(dá)式判斷n元素是否為偶數(shù)。如果是,則返回true,否則返回false?!發(fā)et isEven =re
39、turn n%2=0?true:false”表達(dá)式使用let子句創(chuàng)建新的范圍變量isEven,用來保存"return n%2=0?true:false"表達(dá)式的結(jié)果。"where isEven"表達(dá)式使用where子句篩選isEven的值為true的元素。(八)orderby子句orderby子句可使返回的查詢結(jié)果按升序或者降序排序。升序由關(guān)鍵字ascending指定,而降序由關(guān)鍵字descending指定。注意:orderby子句默認(rèn)排序方式為升序。示例1下面創(chuàng)建一個(gè)查詢表達(dá)式query。該查詢表達(dá)式從arr數(shù)組中查詢大于1且小于6的元素,并且按照n元
40、素對(duì)查詢結(jié)果進(jìn)行降序排序。csharp view plain copy print?int arr =new int0,1,2,3,4,5,6,7,8,9; var query =from n in arr where n>1 && n<6
41、; orderby n descending select n int arr =new int0,1,2,3,4,5,6,7,8,9;var query =from n in arr where n>1 && n<6 orderby n descending select n ;分析1 orderby子句可以包含一個(gè)或多個(gè)排序表達(dá)式,各個(gè)排序表達(dá)式使用
42、逗號(hào)(,)分隔。示例2下面創(chuàng)建一個(gè)查詢表達(dá)式query。該查詢表達(dá)式從arr數(shù)組中查詢大于1且小于6的元素。它使用orderby子句對(duì)查詢結(jié)果進(jìn)行排序,且包含兩個(gè)排序關(guān)鍵字,具體說明如下所示:n%2:按照升序排序;n:按照降序排序。注意:n%2排序關(guān)鍵字優(yōu)先級(jí)大于n排序關(guān)鍵字。因此,該查詢表達(dá)式的結(jié)果首先按照n%2排序關(guān)鍵字升序排序,然后在按照n排序關(guān)鍵字降序排序。分析2在"orderby n%2 ascending,n descending"表達(dá)式中,第一個(gè)排序關(guān)鍵字后的"ascending"可以省略。因?yàn)槟J(rèn)排序方式為升序。(九)group子句gro
43、up子句用來將查詢結(jié)果分組,并返回一對(duì)象序列。這些對(duì)象包含零個(gè)或更多個(gè)與改組的key值匹配的項(xiàng),還可以使用group子句結(jié)束查詢表達(dá)式。注意:每一個(gè)分組都不是單個(gè)元素,而是一個(gè)序列(也屬于集合)。示例1下面創(chuàng)建一個(gè)查詢表達(dá)式query。該查詢表達(dá)式從arr數(shù)組中查詢大于1且小于6的元素,并且按照n%2表達(dá)式的值對(duì)查詢結(jié)果進(jìn)行分組。csharp view plain copy print?int arr =new int0,1,2,3,4,5,6,7,8,9; var query =from n in
44、160;arr where n>1 && n<6 group n by n%2; int arr =new int0,1,2,3,4,5,6,7,8,9;var query =from n in arr where n>1 && n
45、<6 group n by n%2;分析1query查詢表達(dá)式的結(jié)果是一個(gè)序列(類型為IEnumerable<IGrouping<int,int>>),該序列的元素類型為IGrouping<int,int>.其實(shí),該查詢結(jié)果中的元素也是一個(gè)序列。示例2下面使用兩個(gè)foreach語句顯示query查詢表達(dá)式結(jié)果中每一個(gè)元素的值。csharp view plain copy print?foreach(var g in query)
46、 foreach(var o in g) Console.WriteLine(0);
47、; foreach(var g in query) foreach(var o in g) Console.WriteLine(0); 分析2使用group子句對(duì)查詢結(jié)果分組后,每一個(gè)分組都存在一個(gè)鍵(由key屬性表示)。通過key屬性可以獲取每一個(gè)分組的鍵的值。(十)into子句 into子句可以用來創(chuàng)建一個(gè)臨時(shí)標(biāo)識(shí)符,將group、join或select子句的結(jié)果存儲(chǔ)到這個(gè)標(biāo)識(shí)符中。示例1下面創(chuàng)建一個(gè)查詢表達(dá)式query。該查詢表達(dá)式從arr數(shù)組中查詢大于1且小于6的元素,并且按照n%2表達(dá)式的值對(duì)查詢結(jié)果進(jìn)行分組。該查詢表達(dá)式的具體
48、說明如下所示:where n>1 && n<6:指定篩選大于1且小于6的元素。group n by n%2 into g: 按照n%2表達(dá)式的值對(duì)查詢結(jié)果進(jìn)行分組,并使用into子句創(chuàng)建臨時(shí)標(biāo)識(shí)符g。該臨時(shí)標(biāo)識(shí)符臨時(shí)保存分組結(jié)果。from sn in g:從g標(biāo)識(shí)符指定的每一個(gè)分組中查詢sn元素。select sn:表示查詢sn元素。csharp view plain copy print?int arr =new int0,1,2,3,4,5,6,7,8,9; var query =from&
49、#160;n in arr where n>1&& n<6 group n by n%2 into g from
50、160;sn in g select sn; int arr =new int0,1,2,3,4,5,6,7,8,9;var query =from n in arr where n>1&& n<6 group n by n%2 into g from sn in g select sn;分析1上述查詢表達(dá)式的查詢結(jié)果包括4個(gè)元素,依次為2、4、3和5(十一)join子句join子句用來連接兩個(gè)數(shù)據(jù)
51、源,即設(shè)置兩個(gè)數(shù)據(jù)源之間的關(guān)系。join子句支持以下3種常見聯(lián)接方式。內(nèi)部聯(lián)接:元素的鏈接關(guān)系 必須同時(shí)滿足兩個(gè)數(shù)據(jù)源,類似于SQL語句中的inner join子句。分組聯(lián)接:包含into子句的join子句。左外部聯(lián)接:元素的鏈接關(guān)系必須滿足聯(lián)接中的左數(shù)據(jù)源,類似于SQL語句中的left join子句。內(nèi)部聯(lián)接:join子句的內(nèi)部聯(lián)接要求兩個(gè)數(shù)據(jù)源都必須存在相同的值,即兩個(gè)數(shù)據(jù)源都必須存在滿足聯(lián)接關(guān)系的元素。示例1下面創(chuàng)建一個(gè)查詢表達(dá)式query。該查詢表達(dá)式使用join子句聯(lián)接了arra和arrb數(shù)組,具體說明如下。創(chuàng)建arra數(shù)組,它包含10個(gè)元素(09)。創(chuàng)建arrb數(shù)組,它包含5個(gè)元素
52、(0、2、4、6和8)。創(chuàng)建query查詢。from a in arra:從arra數(shù)組中選擇元素,并表示為a。where a <7: 從arra數(shù)組中選擇小于7的元素join b in arrb on a equals b: 將arra和arrb數(shù)組進(jìn)行聯(lián)接,同時(shí)滿足a和b相等的條件。其中,b元素是arrb數(shù)組中的元素。select a: 選擇a元素。csharp view plain copy print?int arra =new int 0,1,2,3,4,5,6,7,8,9; int arrb =
53、new int0,2,4,6,8; var query =from a in arra where a <7 join b in arrb on a equals
54、;b select a; int arra =new int 0,1,2,3,4,5,6,7,8,9;int arrb =new int0,2,4,6,8;var query =from a in arra where a <7 join b in arrb on a equals b select a;分析1上述查詢表達(dá)式首先選擇小于7的元素,(包括06),然后再喝arrb數(shù)組進(jìn)行聯(lián)接,并獲取既包含在0,1,2,3,4,5,6
55、集合中,又包含在arrb數(shù)組中的元素。最終,查詢表達(dá)式的結(jié)果包含4個(gè)元素(0、2、4和6)分組聯(lián)接:join子句的分組聯(lián)接包含into子句的join子句的鏈接。它將左數(shù)據(jù)源與右數(shù)據(jù)源的元素一次匹配。左數(shù)據(jù)源的所有元素都出現(xiàn)在查詢結(jié)果中。若在右數(shù)據(jù)源中找到匹配項(xiàng),則使用匹配的數(shù)據(jù),否則用空表示。示例1下面創(chuàng)建一個(gè)查詢表達(dá)式query。該查詢表達(dá)式使用join子句聯(lián)接arra和arrb數(shù)組,具體說明如下:創(chuàng)建arra數(shù)組,它包含10個(gè)元素(09)。創(chuàng)建arrb數(shù)組,它包含5個(gè)元素(0、2、4、6和8)。創(chuàng)建query查詢。from a in arra:從arra數(shù)組匯總選擇元素,并表示為a。whe
56、re a<7:從arra數(shù)組中選擇小于7的元素。join b in arrb on a equals b into g:將arra和arrb數(shù)組進(jìn)行聯(lián)接,同時(shí)滿足a和b相等的條件。最后,保存為g分組。其中,b元素是arrb數(shù)組中的元素。select newID=a,Values =g;指定查詢結(jié)果是一個(gè)對(duì)象集合。該對(duì)象包含兩個(gè)屬性:ID和Values,它在select子句中由匿名對(duì)象初始化器創(chuàng)建。每一個(gè)對(duì)象的ID屬性的值是當(dāng)前元素的值、value屬性的值為g分組。左外部鏈接: join子句的左外部鏈接將返回左側(cè)數(shù)據(jù)源序列中的所有元素,就算它們?cè)谟覀?cè)序列中沒有匹配的元素也是這樣。示例2下面
57、創(chuàng)建一個(gè)查詢表達(dá)式query。該查詢表達(dá)式使用join子句聯(lián)接arra和arrb數(shù)組,具體說明如下所示:創(chuàng)建arra數(shù)組,它包含10個(gè)元素(09)。創(chuàng)建arrb數(shù)組,它包含5個(gè)元素(0、2、4、6和8)。創(chuàng)建query查詢。from a in arra:從arra數(shù)組中選擇元素,并表示為a。where a <7:從arra數(shù)組中選擇小于7的元素。join b in arrb on a equals b into g:將arra和arrb數(shù)組進(jìn)行聯(lián)接,同時(shí)滿足a和b相等的條件。最后,保存為g分組。其中,b元素是arrb數(shù)組中的元素。注意:在此,左數(shù)據(jù)源為"from a in ar
58、rb"和"where a <7"產(chǎn)生的數(shù)據(jù)源,右數(shù)據(jù)源為arrb數(shù)組。from ab in g.DefaultEmpty():查詢g分組中的每一個(gè)元素。如果該分組不存在元素,則返回默認(rèn)值。如果序列(在此為g)為空,則DefaultEmpty() 方法返回只包含一個(gè)元素的序列,該元素類型的值為默認(rèn)值(在此為0)。select ab:選擇ab元素。分析2上述查詢表達(dá)式首先選擇小于7的元素(包括06),然后再和arrb數(shù)組進(jìn)行左鏈接。該查詢表達(dá)式的結(jié)果包含7個(gè)元素(與左數(shù)據(jù)源中的元素的數(shù)量相等)。如果g分組為空,則返回該分組的元素類型的默認(rèn)值(0),否則返回該元素
59、。當(dāng)左數(shù)據(jù)源中的元素的值為1、3和5時(shí),g分組為空,此時(shí),它將返回默認(rèn)值0.當(dāng)左數(shù)據(jù)源中的元素的值為0、2、4和6時(shí),g分組不為空。此時(shí),它將返回該元素的值,分別為0、2、4和6.最終,查詢表達(dá)式的結(jié)果包含7個(gè)元素(0、0、2、0、4、0和6)。Lambda表達(dá)式基礎(chǔ)篇一.簡(jiǎn)介 一個(gè)LambdaExpression(譯為Lambda式)就是一個(gè)包含若干表達(dá)式和語句的匿名函數(shù)??梢员挥米鲃?chuàng)建委托對(duì)象或表達(dá)式樹類型。Lambda表達(dá)式對(duì)于編寫 LINQ查詢表達(dá)式特別有用。
60、160;所有的Lambda式都使用操作符“=>“,表示“goesto (轉(zhuǎn)變?yōu)?”。操作符左邊部分是輸入?yún)?shù)表,右邊部分是表達(dá)式或語句塊。接下來就看一下它的作用及用法。二.何時(shí)用? 在Framework 2.0 以前,聲明委托的唯一方法是通過方法命名,從Framework2.0 起,系統(tǒng)開始支持匿名方法。通過匿名方法,可以直接把一段代碼綁定給事件,因此減少了實(shí)例化委托所需的編碼系統(tǒng)開銷。而在 Framework 3.0開始,Lambda 表達(dá)式開始逐漸取代了匿名方法,作為編寫內(nèi)聯(lián)代碼的首選方式??傮w來說,
61、Lambda表達(dá)式的作用是為了使用更簡(jiǎn)單的方式來編寫匿名方法,徹底簡(jiǎn)化委托的使用方式。那么接下來就通過幾個(gè)實(shí)例來理解一下吧!用匿名方法csharp view plain copy print?1. <span style="font-size:18px;">static voidMain(string args) 2. 3.
62、0; Button btn = new Button(); 4. btn.Click+=delegate(objectobj,EventArgs e) 5. &
63、#160; MessageBox.Show("HelloWorld !"); 6. 7. </span> <span style="font
64、-size:18px;">static voidMain(string args) Button btn = new Button(); btn.Click+=delegate(objectobj,EventArgs e) MessageBox.Show("HelloWorld !"); ; </span> 使用Lambda表達(dá)式 csharp view plain copy print?1. <span style="font-size:18px;"><spanstyle=&q
65、uot;font-size:18px;">static void Main(string args) 2. 3. Button btn = new Button(); &
66、#160;4. btn.Click+=(object obj,EventArgse)=> 5. MessageBox.Show("Hello World!"); 6.
67、60; 7. 8. </span></span> <span style="font-size:18px;"><spanstyle="font-size:18px;">static void Main(string
68、args) Button btn = new Button(); btn.Click+=(object obj,EventArgse)=> MessageBox.Show("Hello World!"); ; </span></span> 通過以上對(duì)匿名函數(shù)和Lambda表達(dá)式的實(shí)戰(zhàn)是否發(fā)現(xiàn)Lambda表達(dá)式其實(shí)就是一個(gè)匿名函數(shù),但是它比匿名函數(shù)更容易讓人理解,更簡(jiǎn)單,這也是它近年來發(fā)展迅速的原因吧!接下來就針對(duì)Lambda表達(dá)式來講解一下。三.表達(dá)式用法1.表達(dá)式Lambda&
69、#160; 由一個(gè)計(jì)算表達(dá)式組成的一個(gè)Lambda式稱之為表達(dá)式Lambda。表達(dá)式Lambda常被用于構(gòu)造表達(dá)式樹。一個(gè)表達(dá)式Lambda返回計(jì)算表達(dá)式運(yùn)算的結(jié)果?;窘Y(jié)構(gòu):csharp view plain copy print?1. (input parameters)=> expression (input parameters)=> expression 如果只有一個(gè)輸入?yún)?shù)時(shí),括號(hào)可以省略。如果具有一個(gè)以上
70、的輸入?yún)?shù),必需加上括號(hào)。 csharp view plain copy print?1. (x) => x * x 等于 x => x * x 2. (x, y) => x =y (x) => x * x 等于 x => x * x (x, y) => x =y
71、可以顯式指定輸入?yún)?shù)的類型 csharp view plain copy print?1. (int x, string s)=> s.Length > x (int x, string s)=> s.Length > x 也可以沒有任何輸入?yún)?shù) csharp view plain copy print?1. () =>SomeMethod1()
72、 () =>SomeMethod1() 上面這段代碼在Lambda式中調(diào)用了一個(gè)方法。需要注意的是,如果在創(chuàng)建會(huì)被其他方使用的表達(dá)式樹的時(shí)候,不宜在Lambda式中執(zhí)行方法調(diào)用。比如:在SQLServer內(nèi)執(zhí)行。 一般來說,讓一個(gè)方法在原先設(shè)計(jì)的上下文環(huán)境以外執(zhí)行沒有意義,也不能真正工作。2.語句Lambda 語句Lambda和表達(dá)式Lambda非常相
73、似,只是語句被包含在大括號(hào)內(nèi): csharp view plain copy print?1. (input parameters)=> statement; (input parameters)=> statement; 大括號(hào)中的語句可以是任意多條,也可以寫成多行(定義一個(gè)Lambda式也就是在定義一個(gè)匿名方法): csharp view plain copy print?1. Te
74、stDelegate myDel= n => string s =n + " " + "World" 2. Console.WriteLine(s); TestDelegate myDel= n => string s =n + " " + "World"
75、 Console.WriteLine(s); 當(dāng)然語句Lambda跟匿名方法一樣,無法用于創(chuàng)建表達(dá)式樹。3.類型猜測(cè) 當(dāng)編寫一個(gè)Lambda式的時(shí)候,我們通常不需要明確指定輸入?yún)?shù)的類型。因?yàn)榫幾g器會(huì)根據(jù)Lambda體的實(shí)現(xiàn),以及委托的定義來猜測(cè)類型。 舉例:如果要從一個(gè)List<int>中刪除小于100的元素 c
76、sharp view plain copy print?1. Llst.RemoveAll(i=>i < 100);/i會(huì)被猜測(cè)為int Llst.RemoveAll(i=>i < 100);/i會(huì)被猜測(cè)為int通常的猜測(cè)規(guī)則如下: 1. Lambda式必須包含與委托定義中相等數(shù)量的輸入?yún)?shù); 2. 每個(gè)Lambda式的輸入?yún)?shù)必須能夠隱式轉(zhuǎn)換成委托定義中所要求的輸入?yún)?shù); 3.Lambda式的返回值必須能夠隱式轉(zhuǎn)換成委托定義中的返回值。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高考作文心理描寫試題及答案
- VB網(wǎng)絡(luò)編程的基本原理與題及答案
- 2025年法學(xué)概論考試技巧分享與試題及答案
- 行政管理倫理問題及試題答案思考
- 快消品包裝行業(yè)可持續(xù)發(fā)展與綠色包裝設(shè)計(jì)理念傳播效果評(píng)估報(bào)告
- 敘利亞政府協(xié)議書
- 鄰居裝修協(xié)議書
- 財(cái)務(wù)管理跨文化管理研究試題及答案
- 飛灰區(qū)間協(xié)議書
- 青年選手協(xié)議書
- 低鈣血癥護(hù)理措施
- 大學(xué)生民法典教育
- 湖北省武漢市江岸區(qū)2024-2025學(xué)年上學(xué)期元調(diào)九年級(jí)物理試題(含答案)
- 2025年高考政治復(fù)習(xí)知識(shí)清單必修一《中國特色社會(huì)主義》【思維導(dǎo)圖】
- 高壓均質(zhì)及熱處理改性鷹嘴豆蛋白對(duì)減磷豬肉糜凝膠特性的影響機(jī)制
- 物流配送智能調(diào)度算法-深度研究
- 店鋪商品盤點(diǎn)表
- 2024年不動(dòng)產(chǎn)登記代理人《地籍調(diào)查》考試題庫大全(含真題、典型題)
- 河道治理及生態(tài)修復(fù)工程 施工方案與技術(shù)措施
- 【MOOC】《英語進(jìn)階讀與寫》(電子科技大學(xué))章節(jié)作業(yè)期末中國大學(xué)慕課答案
- 大學(xué)美育知到智慧樹章節(jié)測(cè)試課后答案2024年秋長春工業(yè)大學(xué)
評(píng)論
0/150
提交評(píng)論