最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# Lambda 知識回顧

 更新時間:2017年01月16日 09:40:51   作者:反骨仔(二五仔)  
本文主要介紹了C#中Lambda的相關(guān)知識。具有一定的參考價值,下面跟著小編一起來看下吧

它是第十一個希臘字母,一個擁有失意、無奈、孤獨、低調(diào)等含義的流行符號,也指示一款稱為“半年命”的游戲。

不過,這次我所講的是 C# 中的 Lambda。

目錄

  • Lambda 簡介
  • Lambda 表達(dá)式
  • Lambda 語句
  • 異步 Lambda
  • 在 LINQ 中使用 Lambda
  • Lambda 中的類型推斷
  • Lambda 中的變量使用范圍
  • Lambda 的特點

Lambda 簡介

Lambda 表達(dá)式,是一種簡化的匿名函數(shù),可用于創(chuàng)建委托或表達(dá)式目錄樹。其次,你也可以將 Lambda 表達(dá)式作為參數(shù)進(jìn)行傳遞,或者將它作用于函數(shù)調(diào)用值調(diào)用后返回的一個函數(shù)來使用。我們經(jīng)常在 LINQ 中使用 Lambda 表達(dá)式。

創(chuàng)建 Lambda 表達(dá)式的簡單語法形式:輸入?yún)?shù) => 表達(dá)式或語句塊。其中,=> 為 Lambda 運算符,可讀作“goes to” 。

delegate int MyDel(int x); 
 static void Main(string[] args) 
 { 
  MyDel myDel = x => x++; 
  var j = myDel(5); 
 }

創(chuàng)建表達(dá)式樹:

Expression<MyDel> myDel = x => x++;  

=> 運算符和 = 運算符 (賦值運算符),具有相同的優(yōu)先級,并且都是右結(jié)合運算。

我們經(jīng)常在 LINQ 查詢中使用 Lambda 表達(dá)式,如作為 Where<TSource> 的參數(shù)。該方法有多個重載,這里只列舉了其中一個。

//
  // 摘要: 
  //  基于謂詞篩選值序列。
  //
  // 參數(shù): 
  // source:
  //  要篩選的 System.Collections.Generic.IEnumerable<T>。
  //
  // predicate:
  //  用于測試每個元素是否滿足條件的函數(shù)。
  //
  // 類型參數(shù): 
  // TSource:
  //  source 中的元素的類型。
  //
  // 返回結(jié)果: 
  //  一個 System.Collections.Generic.IEnumerable<T>,包含輸入序列中滿足條件的元素。
  //
  // 異常: 
  // System.ArgumentNullException:
  //  source 或 predicate 為 null。
  public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);

參數(shù)是委托類型 Func<TSource, bool> predicate),這里使用 Lambda 表達(dá)式進(jìn)行創(chuàng)建我想應(yīng)該是最合適的。還有,假如參數(shù)類型為抽象類的 System.Linq.Expressions.Expression<Func>,其中 Func 委托是重載具有十六個參數(shù)的,你也可以使用 Lambda 表達(dá)式創(chuàng)建對應(yīng)的表達(dá)式樹。

【注意】在 is 或 as 運算符的左側(cè)不允許使用 Lambda 表達(dá)式。

 Lambda 表達(dá)式

表達(dá)式在 => 運算符右側(cè),稱“l(fā)ambda 表達(dá)式”。lambda 表達(dá)式常用于 LINQ 和構(gòu)建表達(dá)式樹,它也允許返回結(jié)果。

基本形式:( 輸入?yún)?shù) ) => 表達(dá)式 。

如:  

  ( ) => true;
   x => x == 1;
  (x) => x == 1; 
  (x, y) => x == y;

【備注】當(dāng) lambda 表達(dá)式有且只有一個輸入?yún)?shù)的時侯,括號(“()”)才是可選的。 括號內(nèi)存在多個輸入?yún)?shù)時使用“,”進(jìn)行分割。

 你也可以選擇顯式指定類型,一般只有在編譯器難以或無法準(zhǔn)確推斷輸入類型的時候。

Func<int, int, bool> func = (int x, int y) => x == y;

這里使用空括號(“()”)指定零個輸入?yún)?shù),并且可以在 Lambda 的主體包含一個或多個方法進(jìn)行調(diào)用。

() => YourMethod()  

Lambda 語句

lambda 語句和上面的 lambda 表達(dá)式相比,只是多了個大括號(“{ }”)?!?/p>

基本形式:( 輸入?yún)?shù) ) => { 表達(dá)式 } 。

lambda 語句的主體可以由任意數(shù)量的普通語句組成,不過,我們一般寫的語句不多(三個左右吧)。

delegate void MyDel(string s); 
// ...
MyDel myDel = n => { var s = n + " Fanguzai!"; Console.WriteLine(s); }; 
myDel("Hi,");

異步 Lambda

通過 async 和 await 關(guān)鍵字,我們可以很簡單并快速的創(chuàng)建包含異步處理的 lambda 表達(dá)式和語句。

這里,我使用簡單的異步調(diào)用方式,編寫執(zhí)行按鈕觸發(fā)的點擊事件,即調(diào)用異步方法 DoAsync。

public partial class Form1 : Form 
{ 
 public Form1() 
 { 
  InitializeComponent(); 
 } 
 private async void button1_Click(object sender, EventArgs e) 
 { 
  await DoAsync(); 
 } 
 async Task DoAsync() 
 { 
  await Task.Delay(250); 
 } 
}

現(xiàn)在,簡化上面的的 Click 事件,并加上 async。

public partial class Form1 : Form 
{ 
 public Form1() 
 { 
  InitializeComponent(); 
  button1.Click += async (sender, e) => 
  { 
   await DoAsync(); 
  }; 
 } 
 async Task DoAsync() 
 { 
  await Task.Delay(250); 
 } 
}

在 LINQ 中使用 Lambda

許多 LINQ 中的參數(shù)都是一種委托類型的參數(shù),如 Func<T, TResult>,可以定義輸入?yún)?shù)以及返回類型。

public delegate TResult Func<TArg0, TResult>(TArg0 arg0)  

Func<int, bool> 表示:int 為輸入?yún)?shù),bool 為返回值。

Func<int, int, bool> 表示:2個 int 為輸入?yún)?shù),一個 bool 為返回值。

示例:

Func<int, bool> myFunc = x => x == 250; 
var result = myFunc(1314); 

C# 的編譯器可以自動推斷輸入?yún)?shù)的類型,即便是多個輸入?yún)?shù),當(dāng)然,你也可以選擇顯式指定。

var nums = new[] { 2, 5, 0 };
var query = nums.Count(x => x > 2);
var query2 = nums.Count<int>(x => x < 2);

【備注】不要將 => 和 >= 搞錯了,前者是 Lambda 運算符,后者是算術(shù)比較運算符。

Lambda 中的類型推斷

編譯器會根據(jù) Lambda 主體、參數(shù)的委托類型以及 C# 語言規(guī)范和其它等一些因素,對我們所寫的 Lambda 進(jìn)行類型推斷。

在這里,由于源數(shù)據(jù)是一個 int 數(shù)組,即我要查的數(shù)據(jù)為 IEnumerable<int> 類型,編譯器在這里自動推斷元素為 int 類型,意味著 Count 方法內(nèi)的 x 你可以通過 “.” 在 VS 中顯示對應(yīng) int 類型的屬性和方法。

Lambda 中的變量使用范圍

我們可以在 Lambda 的主體中引用范圍之外的變量。如:

var nums = new[] { 2, 5, 0 }; //int[] 類型
var compareNum = 2.5;
var query = nums.Count(x => x == compareNum); 

Lambda 的特點

  • Lambda 中包含輸入?yún)?shù)的數(shù)量,必須與委托類型包含的參數(shù)數(shù)量一致。
  • Lambda 中的每個輸入?yún)?shù),必須都能夠通過隱式轉(zhuǎn)換為其對應(yīng)的委托參數(shù)類型。
  • Lambda 中的返回值(如果有),必須能夠隱式轉(zhuǎn)換為委托的返回類型。

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關(guān)文章

  • C# 關(guān)于AppDomain的一些總結(jié)

    C# 關(guān)于AppDomain的一些總結(jié)

    這篇文章主要介紹了C# 關(guān)于AppDomain的一些總結(jié),幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-02-02
  • C# Datagridview綁定List方法代碼

    C# Datagridview綁定List方法代碼

    這篇文章主要介紹了C# Datagridview綁定List方法代碼,在進(jìn)行C#數(shù)據(jù)庫程序設(shè)計時非常具有實用價值,需要的朋友可以參考下
    2014-10-10
  • 聊聊Unity 自定義日志保存的問題

    聊聊Unity 自定義日志保存的問題

    這篇文章主要介紹了Unity 自定義日志保存的問題,之前unity5.x在代碼中寫了debug.log打包之后在當(dāng)前程序文件夾下會有個對應(yīng)的"outlog.txt",后來進(jìn)行了更改,今天通過代碼給大家介紹了Unity日志保存的問題,需要的朋友一起看看吧
    2021-05-05
  • C#利用緩存分塊讀寫大文件

    C#利用緩存分塊讀寫大文件

    這篇文章主要為大家詳細(xì)介紹了C#利用緩存分塊讀寫大文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • C#利用delegate實現(xiàn)Javascript的each方法

    C#利用delegate實現(xiàn)Javascript的each方法

    這篇文章主要為大家介紹了介紹了C#利用delegate實現(xiàn)Javascript的each方法,感興趣的朋友可以參考一下
    2016-01-01
  • Entity?Framework配置關(guān)系

    Entity?Framework配置關(guān)系

    這篇文章介紹了Entity?Framework配置關(guān)系的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • ASP.Net動態(tài)讀取Excel文件最簡方法

    ASP.Net動態(tài)讀取Excel文件最簡方法

    本篇文章給大家分享了ASP.Net動態(tài)讀取Excel文件最簡方法,對此有需要的讀者們參考學(xué)習(xí)下。
    2018-05-05
  • C# JavaScriptSerializer序列化時的時間處理詳解

    C# JavaScriptSerializer序列化時的時間處理詳解

    這篇文章主要為大家詳細(xì)介紹了C# JavaScriptSerializer序列化時的時間處理詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • C# Socket編程實現(xiàn)簡單的局域網(wǎng)聊天器的示例代碼

    C# Socket編程實現(xiàn)簡單的局域網(wǎng)聊天器的示例代碼

    這篇文章主要介紹了C# Socket編程實現(xiàn)簡單的局域網(wǎng)聊天器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 根據(jù)灰度值填充字符-單文件單線程版

    根據(jù)灰度值填充字符-單文件單線程版

    本文介紹如何實現(xiàn):類似于一個圖片,處理后,根據(jù)不同的灰度值,填充不同的字符等相關(guān)功能,感興趣的朋友可以了解下哦
    2013-01-01

最新評論

新丰县| 治多县| 盐津县| 绥德县| 桓仁| 霍州市| 分宜县| 厦门市| 蓬安县| 鹤峰县| 鄯善县| 视频| 乡宁县| 彭阳县| 合山市| 宁国市| 濉溪县| 龙井市| 克拉玛依市| 太仓市| 磴口县| 紫阳县| 海林市| 扎囊县| 双流县| 和顺县| 承德县| 姚安县| 正蓝旗| 仙游县| 和平县| 武平县| 定西市| 林周县| 朝阳区| 怀宁县| 郑州市| 仁怀市| 嘉峪关市| 宽甸| 台中市|