1. 程式人生 > >C# Lambda表示式詳細總結

C# 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
  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. 相關推薦

    C# Lambda表示式詳細總結

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

    C# Lambda表示式詳細

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

    C++ lambda表示式總結

        一個lambda表示式用於建立閉包。lambda表示式與任何函式類似,具有返回型別、引數列表和函式體。與函式不同的是,lambda能定義在函式內部。lambda表示式具有如下形式 [ capture list ] ( parameter list) -> r

    c++ lambda表示式(匿名函式)的使用總結

    #include <iostream> using namespace std; //[=] () mutable throw() -> int {} /** * lambda expression * “Lambda 表示式”(lambda exp

    C++ lambda表達式總結

    未命名 函數類 告訴 復制構造 ron 否則 param 參考 第一個元素 一個lambda表達式用於創建閉包。lambda表達式與任何函數類似,具有返回類型、參數列表和函數體。與函數不同的是,lambda能定義在函數內部。lambda表達式具有如下形式 [ ca

    使用ES6新陣列方法(象C# Lambda表示式一樣寫查詢語句)

    let people = [ {id: 1, name: "a", age: 12}, {id: 2, name: "b", age: 13}, {id: 3, name: "c", age: 14}, {id: 4, name: "d", age: 15}

    C++ lambda表示式

    1. lambda表示概念 可將lambda表示式視為包含公有operator()的匿名結構(或類),從這種意義上說,lambda表示式屬於函式物件。從上面所講到的進行分析: for_each(vectorElement.begin(), vectorElement.en

    c++ lambda表示式常用的情形

    lambda表示式介紹 懶,摘自msdn Capture 子句(在 C++ 規範中也稱為 lambda 引導。) 引數列表(可選)。 (也稱為 lambda 宣告符) 可變規範(可選)。 異常規

    C++ lambda表示式入門

    1.lambda表示式 lambda表示式 是一個函式,一個匿名函式,也就是沒有函式名的函式,為什麼不需要函式名呢,因為我們直接(一次性的)用它,嵌入式用的它,不需要其他地方用它。 也叫閉包,閉就是封閉的意思,就是其他地方都不用他,包就是函式。 lambda表示

    C++ lambda表示式一個非常簡單的例子

    如果我想要定義一個指向int為返回值,兩個int為引數的函式的指標,有兩種方法1: 先宣告一個函式int func(int, int);然後使用decltype推斷這個func的型別作為新定義的型別的型別typedef decltype(func) * Func1;2: 直接

    C#Lambda表示式

    需求 有時候我們需要傳遞一個很方法的引用,我們很確定這個方法僅僅會呼叫這一次,單獨為它建立一個方法感覺有些浪費,但是又必須用到這個方法。又或者臨時需要一個方法,但是思考半天想不出該給這個方法取什麼名字(有過這個經歷的同學握個爪)。這個時候Lambda就派上用場

    C# => Lambda表示式理解

    本文參考網上的部落格和找到的資料加上個人理解編寫的,主要的程式碼借鑑:http://www.cnblogs.com/knowledgesea/p/3163725.html、百度百科 希望能夠幫助理解l

    學習C++——lambda表示式

    上面三個是C++學習網站,有助於瞭解C++11的新特性。 lambda表示式(C++11) 1、介紹lambda 我們使用過的僅有兩種可呼叫物件是函式和函式指標。還有其他兩種可呼叫物件:過載了函式呼叫運算子的類,以及lambda表示式。 一個lambda表示式表示一個

    C++ lambda 表示式傳遞的變數預設不可變

    我遇到如下問題: int count=0; listener->onTouchMoved=[count](Touch* t,Event* e){ count++; log("onTouchMoved");

    C++ lambda表示式的編譯器實現..

     現在,Android已經全面轉向C++11/14標準了,看程式碼的話,很多地方變化很大,新標準真的是有點顛覆性的,感覺已經不會C++了。今天有看到lambda表示式,突然想看一下,這貨是怎麼實現的,如下,寫了個例子,分別呼叫3個lambda表示式: #include

    C# Lambda表示式

    上一節中,我們講到:在 2.0 之前的 C# 版本中,宣告委託的唯一方法是使用命名方法。  C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表示式取代了匿名方法,作為編寫內聯程式碼的首選方式。  有一種情況下,匿名方法提供了 Lambda 表示式

    C#lambda表示式和匿名函式

    lambda表示式也被稱為匿名函式,何為匿名函式? 匿名沒有真實名字,當然在C#中就是沒有函式名了,C#裡有兩種匿名函式的寫法,一種是早期推出的匿名函式,而另一種就是拉姆達(lambda)表示式了,那麼這兩種有什麼不同,分別怎麼用的,下面介紹一下. 我個人覺得吧,在寫程式碼

    c++ lambda表示式捕獲變數引數

    []不捕獲任何變數 [&]捕獲外部作用域中所有變數,並作為引用在函式體重使用 [=]捕獲外部作用域中所有變數,並作為副本在函式體重使用 [=,&foo]捕獲外部作用域中所有變數,並作為副本在函式體重使用,對於foo按引用捕獲 [foo]當作副本捕獲foo,不

    Java8 lambda表示式使用總結

    總結了一下自己常用的lambda式。 package com.gm.test; import org.junit.Test; import java.util.*; import java.util.stream.Collectors; import

    C# -- lambda表示式轉為where條件sql語句的方法

    原文轉至:http://www.cnblogs.com/FengCodes/p/LambdaToSqlWhere.html 有更改 /// <summary> /// 根據Expression表示式生成SQL-Where部分的語句 /// <