日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# Lambda表达式 基础

發(fā)布時間:2024/4/17 C# 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# Lambda表达式 基础 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

什么是Lambda 表達式?

    "Lambda表達式"實際上是一個方法,只不過該方法是一個匿名方法(就是沒有名字的方法(函數(shù)),就是說只有在定義的時候能調用,在其他地方就不能調用了),是一種高效的類似于函數(shù)式編程的表達式,? (@高效 : 只在一個地方用用完就不用了,沒必要單獨寫一個方法) 所有Lambda表達式都使用Lambda運算符 =>; ,該運算符讀作"goes to"。該標記在 lambda 表達式中用來將左側的輸入變量與右側的 lambda 體分離。 Lambda 表達式是與匿名方法類似的內(nèi)聯(lián)表達式,但更加靈活;在以方法語法表示的 LINQ 查詢中廣泛使用了 Lambda 表達式。

  注:帶 @ 為個人查資料理解。

Lambda 預備知識

?   1 . Enumerable 類?

    說明 :提供一組用于查詢實現(xiàn) System.Collections.Generic.IEnumerable<T>(泛型集合) 的對象的 static方法。

??????????? 我們平常最常用Lambda的地方是對集合的操作。所以我們要首先簡要列舉一下此類以及常用方法,在使用中詳細介紹。

     Where :? 基于謂詞篩選值序列。

?      Select? : 將序列中的每個元素投影到新表中

     SelectMany :?將序列的每個元素投影到 IEnumerable<T> 并將結果序列合并為一個序列。

     Single<TSource> :?返回序列的唯一元素;如果該序列并非恰好包含一個元素,則會引發(fā)異常.

     Skip<TSource> :?跳過序列中指定數(shù)量的元素,然后返回剩余的元素。

     SkipWhile<TSource> :?只要滿足指定的條件,就跳過序列中的元素,然后返回剩余元素。

     Sum :?計算 Int32 值序列之和。

     Take<TSource> :?從序列的開頭返回指定數(shù)量的連續(xù)元素。

     TakeWhile<TSource> :?只要滿足指定的條件,就會返回序列的元素。

     。。。。。。。。。。。

  2 .?Func<T, TResult>

    由于上面介紹的方法中很多都涉及到一個參數(shù)Func<TSource,TResult>. 鑒于很多小伙伴不太理解這個(我也不太理解),咱就一起探討下。

    Func<T,TR> 定義 :封裝一個具有一個參數(shù)并返回 TResult 參數(shù)指定的類型值的方法

    這個函數(shù)是一個委托(引用類型) public delegate TResult Func<in T, out TResult>(T arg); 共有17個重載

        in T

        此委托封裝的方法的參數(shù)類型。

     out TResult

        此委托封裝的方法的返回值類型。

class Class1{Func<string, string> fc = new Func<string, string>(GetName);public void WriteName(){fc.Invoke("吐魯番");}public static string GetName(string s){return s;}}
看一下我們平時用的Where方法 Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
List<User> userLists = new List<User>() {new User(){ Name = "羅生天" ,PassWord="123456"}, new User(){ Name = "吉祥天" ,PassWord="123456"}, new User(){ Name = "靈寶天" ,PassWord="123456"}, new User(){ Name = "紅塵天" ,PassWord="123456"}, new User(){ Name = "魔剎天" ,PassWord="123456"}, }; var user = userLists.Where(p => p.Name=="羅生天"); var user2 = userLists.Where(delegate(User p) { return p.Name == "羅生天"; });
為什么我們平時傳參傳的是lambda表達式呢 看下面這個例子:
先看下這條語句? Func<int,?bool>?d?=?x?=>?x?==?10???true?:?false ; 為什么 可以寫成這種形式呢 ? 
? 答: 請注意委托簽名具有一個 int 類型的隱式類型輸入?yún)?shù),并返回bool。可以將 Lambda 表達式轉換為該類型的委托,因為該表達式也具有一個輸入?yún)?shù) (x),以及一個編譯器可隱式轉換為 bool 類型的返回值。(百度百科)。
這就是我們平時為什么這樣寫了

Lambda使用注意事項

    在 is 或 as 運算符的左側不允許使用 Lambda。

適用于匿名方法的所有限制也適用于 Lambda 表達式。有關更多信息,請參見匿名方法(C# 編程指南)。 特殊     下列規(guī)則適用于 Lambda 表達式中的變量范圍:捕獲的變量將不會被作為垃圾回收,直至引用變量的委托超出范圍為止。 在外部方法中看不到 Lambda 表達式內(nèi)引入的變量。 Lambda 表達式無法從封閉方法中直接捕獲 ref 或 out 參數(shù)。 Lambda 表達式中的返回語句不會導致封閉方法返回。 Lambda 表達式不能包含其目標位于所包含匿名函數(shù)主體外部或內(nèi)部的 goto 語句、break 語句或 continue 語句。 Lambda表達式的本質是“匿名方法”,即當編譯我們的程序代碼時,“編譯器”會自動將“Lambda表達式”轉換為“匿名方法”,如下例:     string[] names={"agen","balen","coure","apple"};string[] findNameA=Array.FindAll<string>(names,delegate(string v){return v.StartsWith("a");});string[] findNameB=Array.FindAll<string>(names,v=>v.StartsWith("a"));

    上面中兩個FindAll方法的反編譯代碼如下:  

    string[]findNameA=Array.FindAll<string>(names,delegate(stringv){returnv.StartsWith("a");});string[]findNameB=Array.FindAll<string>(names,delegate(stringv){returnv.StartsWith("a");});

從而可以知道“Lambda表達式”與“匿名方法”是可以劃上等號的,只不過使用“Lambda表達式”輸寫代碼看上去更直觀漂亮,不是嗎?

Lambda表達式使用?

?1. 輸入?yún)?shù) ( "=>"運算符 左邊 )和表達式或語句塊( "=>"運算符 右邊 )? 

?????? 輸入?yún)?shù) 即 " => " 左邊部分 。它包含的參數(shù)數(shù)量可以 為0 ,1 或者多個。當輸入?yún)?shù)個數(shù) 是1 時 ,表達式左邊的小括號 可以省略 ,其他必須加括號

   輸入?yún)?shù) 數(shù)量 大于或者等于 2 時,表達式 左邊的小括號 用 "," 分開

(x, y) => x == y

????? 有時,編譯器難以或無法推斷輸入類型。 如果出現(xiàn)這種情況,你可以按以下示例中所示方式顯式指定類型:

(int x, string s) => s.Length > x

  沒有參數(shù)

() => SomeMethod()

?

2. 與Enumerable 類 結合使用

List<User> userLists = new List<User>() {new User(){ Name = "羅生天" ,PassWord="123456"},new User(){ Name = "吉祥天" ,PassWord="123456"},new User(){ Name = "靈寶天" ,PassWord="123456"},new User(){ Name = "紅塵天" ,PassWord="123456"},new User(){ Name = "魔剎天" ,PassWord="123456"},new User(){ Name = "清虛天" ,PassWord="123456"},};

(1)Where方法 ? Func<TSource, Boolean>用于測試每個元素是否滿足條件的函數(shù),返回值是bool類型。 相當于 if (x > y) 即篩選條件 ;

?Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)

var user = userLists.Where(p => p.Name=="羅生天");

?這種寫法是 當調用Where方法時TSource已經(jīng)確定 返回值也已經(jīng)確定IEnumerable<User> 。(

Where<TSource>(IEnumerable<TSource>, Func<TSource, Int32, Boolean>)

var otherUser = userLists.Where<User>((p,m) => p.Name.Length > m);

?第二個參數(shù)為該元素的索引。

 (2) Select方法 將序列中的每個元素投影到新表中。與Where一樣有兩個重載 第二個參數(shù) 是索引。通俗來說就是 把集合中的元素 的某些屬性 拿出來 。

?Select<TSource, TResult>(IEnumerable<TSource>, Func<TSource, TResult>)

List<string> strs = new List<string>() { "12","2adfs","3456"};var caste = strs.Select<string,string>(st =>{if (st.Length > 2)st = "123";return st;}); View Code var names = userLists.Select(p => p.Name); // 取每個元素中的 "Name" 返回值為IEnumerable<string>var newList = userLists.Select(p => new Student(){Name = p.Name,Grade =Convert.ToInt32( p.PassWord)}); // 得到新類型的集合 此時的返回值為IEnumerable<Student>

?(3)TakeWhile 實例? 與Where 不同點是 當找到匹配的元素時就會返回? 一個 IEnumerable<T>,包含輸入序列中出現(xiàn)在測試不再能夠通過的元素?? (未匹配)之前的元素。

string[] fruits = { "apple", "banana", "mango", "orange", "passionfruit", "grape" };IEnumerable<string> query =fruits.TakeWhile(fruit => String.Compare("orange", fruit, true) != 0);foreach (string fruit in query){Console.WriteLine(fruit);}/*This code produces the following output:applebananamango*/

暫時先到這了 最常用的也就是Where跟Select了。 雖然還有好多東西沒介紹不過大概都差不多。大家可以自己多了解下其他的 ,第一次寫博客 文章難免會有漏洞 或者不對的地方 ,希望大家能指出來 一起討論 一起學習 ,一起進步 。祝大家早日 升職加薪, 當上總經(jīng)理, 出任CEO, 迎娶白富美, 走上人生巔峰。

  

?

轉載于:https://www.cnblogs.com/kunlunmountain/p/4480097.html

總結

以上是生活随笔為你收集整理的C# Lambda表达式 基础的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。