1. 程式人生 > >Lambda拉姆達表示式

Lambda拉姆達表示式

(一)輸入引數

在Lambda表示式中,輸入引數是Lambda運算子的左邊部分。它包含引數的數量可以為0、1或者多個。只有當輸入引數為1時,Lambda表示式左邊的一對小括弧才可以省略。輸入引數的數量大於或者等於2時,Lambda表示式左邊的一對小括弧中的多個引數質檢使用逗號(,)分割。

示例1

下面建立一個Lambda表示式,它的輸入引數的數量為0.該表示式將顯示“This is a Lambda expression”字串。

  1. ()=>Console.WriteLine("This is a Lambda expression.");  

分析2

由於上述Lambda表示式的輸入引數的數量為0,因此,該Lambda表示式的左邊部分的一對小括弧不能被省略。

示例2

下面建立一個Lambda表示式,它的輸入引數包含一個引數:m。該表示式將計算m引數與2的乘積。

  1. m=>m*2;  
分析2

上述Lambda表示式的輸入引數省略了一對小括弧,它與“(m)=>m*2”Lambda表示式是等效的。

示例3

下面建立一個Lambda表示式,它的輸入引數包含兩個引數:m和n。該表示式將計算m和n引數的乘積。

  1. (m,n)=>m*n;  

(二)表示式或語句塊

多個Lambda表示式可以構成Lambda語句塊。語句塊可以放到運算子的右邊,作為Lambda的主體。根據主題不同,Lambda表示式可以分為表示式Lambda和語句Lambda。語句塊中可以包含多條語句,並且可以包含迴圈、方法呼叫和if語句等。

示例1

下面建立一個Lambda表示式,它的右邊部分是一個表示式。該表示式計算m引數的平方值。

  1. m=>m*n;  
分析1

如果Lambda表示式的右邊部分是一個語句塊,那麼該語句塊必須被"{"和"}"包圍。

示例2

下面建立一個Lambda表示式,它的輸入引數包括兩個引數:m和n。該表示式的右邊包含2個表示式;第一個表示式計算m和n引數的乘積,結果儲存為result變數;第二個表示式顯示result變數的值。

  1. (m,n)=>{int result=m*n; Console.WriteLine(result);}  
分析2

上述Lambda表示式的右邊部分包含2個表示式,因此,該表示式的右邊部分必須被"{"和"}"包圍。

(三)查詢表示式

查詢表示式是一種使用查詢語法表示的表示式,它用於查詢和轉換來自任意支援LINQ的資料來源中的資料。查詢表示式使用許多常見的C#語言構造,易讀簡潔,容易掌握。它由一組類似於SQL或XQuery的宣告性語法編寫的子句組成。每一個子句可以包含一個或多個C#表示式。這些C#表示式本身也可能是查詢表示式或包含查詢表示式。

●查詢表示式必須以from子句開頭,以select或group子句結束。第一個from子句和最後一個select子句或group子句之間,可以包含一個活多個where子句、let子句、join子   句、orderby子句和group子句,甚至還可以是from子句。它包括8個基本子句,具體說明如下所示。

●from子句:指定查詢操作的資料來源和範圍變數。

●select子句:指定查詢結果的型別和表現形式。

●where子句:指定篩選元素的邏輯條件。

●let子句:引入用來臨時儲存查詢表示式中的字表達式結果的範圍變數。

●orderby子句:對查詢結果進行排序操作,包括升序和降序。

●group子句:對查詢結果進行分組。

●into子句:提供一個臨時識別符號。join子句、group子句或select子句可以通過該識別符號引用查詢操作中的中堅結果。

●join子句:連線多個用於查詢操作的資料來源。

示例1

下面建立一個查詢表示式query,該查詢表示式查詢arr陣列中的每一個元素。

int[]arr =new int[]{0,1,2,3,4,5,6,7,8,9};

分析1

  1. var query1=from n in arr  
  2.                 select n;  
示例2

下面建立一個查詢表示式query2.該查詢表示式查詢arr陣列中大於6的元素。

  1. int[] arr =newint[]{0,1,2,3,4,5,6,7,8,9};  
  2. var query2=from n in arr  
  3.               where n >6  
  4.               select n;  

分析2

變數只是儲存查詢操作,而不是查詢的結果。當查詢表示式執行查詢操作時,才會計算該查詢表示式的結果。以上兩個變數的型別都屬於集合型別。

(四)from子句

from子句用來指定查詢表示式的資料來源和範圍變數。它是查詢表示式的必有部分,並且它出現在最開始。資料來源不但可以包括查詢本身的資料來源,而且還可以包括子查詢的資料來源。範圍變數用來表示資料來源序列中的每一個元素。

注意:from子句指定的資料來源的型別必須為IEnumerable,IEnumerable<T>或一種派生型別。

示例1

下面建立一個查詢表示式query。該查詢表示式查詢arr陣列中的每一個元素。在query查詢表示式中,arr陣列為資料來源,n為範圍變數。n範圍變數的型別arr資料來源的元素型別。

分析
  1. int[] arr =newint[] {0,1,2,3,4,5,67,8,9};  
  2. var query =from n in arr  
  3.  select n;  
下面我們來學習資料來源和包含不同的from子句查詢表示式。

資料來源:指定資料的來源,它的形式可以為靜態陣列、動態陣列(Arraylist)、集合、資料集(DataSet)、資料表、MML片段、MML檔案等。

如果資料來源實現了IEnumerable<T>介面,那麼編譯器可以推斷範圍變數的型別為其元素型別。例如:資料來源的型別為IEnumerable<UserInfo>,那麼可以推斷出範圍 變數的型別為UseInfo。

示例2

下面建立一個查詢表示式query。該查詢表示式查詢list反省陣列中的每一個元素。在query查詢表示式中,list反省陣列為資料來源。u為範圍變數。u範圍變數的型別為list資料來源的元素型別(UserInfo)。

分析2

  1. List<UserInfo> list=...  
  2. var query =from u in list  
  3.            select u;  
如果當資料來源是非泛型IEnumerable型別(如ArrayList等)時,需要顯示指定範圍變數的型別。

示例3

下面建立一個查詢表示式query。該查詢表示式查詢list陣列中的每一個元素。在query查詢表示式中,list陣列為資料來源,u為範圍變數。u範圍變數的型別被指定為list資料來源的元素型別(UserInfo)。

分析3

  1. ArrayList list =new ArrayList();  
  2. list.Add(...);  
  3. ...  
  4. var query =from UserInfo u in list  
  5.     select u;  
包含單個from子句的查詢表示式

在查詢表示式中,from子句至少有一個。當from子句只有一個時,構成的查詢表示式被稱為包含單個from子句的查詢表示式。一般的,包含單個from子句的查詢表示式只包含一個數據源。

示例4

下面建立一個查詢表示式query。該查詢表示式查詢arr陣列中的每一個元素,它就是一個包含單個from子句的查詢表示式。

分析4

  1. int[] arr =newint[]{0,1,12,3,4,5,6,7,8,9};  
  2. var query =from n in arr  
  3.        select n;  

包含多個from子句的查詢表示式

在查詢表示式中,當from子句有兩個或兩個以上時,構成的查詢表示式被稱為包含多個from子句的查詢表示式。

示例5

下面建立一個查詢表示式query。該查詢表示式包含兩個from子句,他們分別查詢兩個獨立的資料來源;arr1陣列和arr2陣列。最後,使用select子句計算當前元素的和。

分析5

  1. int[] arr1= newint[] {0,1,2,3,4,5,6,7,8,9};  
  2. int[] arr2=newint[] {0,1,2,3,4,5,6,7,8,9};  
  3. var query =from a in arr1  
  4.        from b in arr2  
  5.        select a +b;  

包含符合from子句的查詢表示式

在查詢表示式中,有可能查詢表示式的資料來源中的每一個元素本身也作為該查詢表示式的資料來源。那麼要查詢資料來源中的每一個元素中的元素,則需要使用符合from子句。符合from子句類似於巢狀的foreach語句。

示例6

下面建立一個名稱為Test的類,該類包含兩個欄位:Name和AliasName。其中,Name欄位的型別為string,AliasName欄位的型別為string型別列表。因此,它也可以作為子查詢表示式的資料來源。

分析6

  1. publicclass Test  
  2. {  
  3.     Public string Name;  
  4.     Public List<string> AliasName;  
  5. }  

示例7

下面建立一個查詢表示式query。該查詢表示式包含了一個符合from子句:第一個from子句查詢list泛型集合;第二個from子句查詢list集合中元素的AliasName欄位,為第一個from子句的子查詢。最後,使用select子句將u變數的Name屬性的值和name變數的值拼接為一個字串。

分析7

  1. List<MUserInfo> list =...  
  2. var query =from u in list  
  3.      from name in u.AliasName  
  4. select u.Name+name;  

(五)select子句

select子句用來指定將在執行查詢時產生的值的型別。查詢表示式必須以select子句或group子句結束。

示例1

下面建立一個查詢表示式query。該查詢表示式查詢arr陣列中的每一個元素。

分析1

  1. int[] arr =newint[] {0,1,2,3,4,5,6,7,8,9};  
  2. var query =from n in arr  
  3.        select n;  
示例2

下面建立一個查詢表示式query。該查詢表示式查詢arr陣列中的每一個元素和10的乘積。

  1. int[] arr =newint[] {0,1,2,3,4,5,6,7,8,9};  
  2. var query =from n in arr   
  3.     select n*10;  
分析2

select子句中的“n*10”表示式決定了查詢結果的表現形式,即計算每一個元素和10的乘積。

示例3

下面建立一個查詢表示式query。該查詢表示式查詢arr陣列中的每一個元素,查詢結果是一個物件的集合物件包含兩個屬性:ID和Name,它在select子句中由匿名物件初始化器建立。每一個物件的ID屬性的值是當前元素的值、Name屬性的值為元素的值的字串的表現形式。

分析3

  1. int[] arr =newint[]{0,1,2,3,4,5,6,7,8,9};  
  2. var query =from n in arr   
  3.     select new
  4.     {  
  5.          ID=n,  
  6.          Name =n.ToString()  
  7.     };  

(六)where子句

where子句用來指導將在查詢表示式中返回資料來源中的哪些元素。它將一個布林條件應用於資料來源中的每個元素,並返回指定條件的元素。查詢表示式可以包含一個或多個where子句。

示例1

下面建立一個查詢表示式query。該查詢表示式從arr陣列中查詢小於3的元素

  1. int[] arr =newint[] {0,1,2,3,4,5,6,7,8,9};  
  2. var query =from n in arr  
  3.         where n <3  
  4.         select n;  

分析1

上述where子句只包含一個布林表示式“n<3”,該表示式將篩選小於3的元素。

在一個where子句中,也可以包含多個布林表示式,各個表示式直接使用邏輯運算子(如&&和||)分隔。

示例2

下面建立一個查詢表示式query。該查詢表示式從arr陣列中查詢大於3且小於6的元素。

  1. int[] arr =newint[]{0,1,2,3,4,5,6,7,8,9};  
  2. var query =from n in arr  
  3.               where n >3 && n<6  
  4.               select n;  
分析2

上述where子句包含兩個布林表示式"n>3"和"n<6",它們共同指定將篩選大於3且小於6的元素。這兩個布林表示式使用&&運算