你真的了解Lambda表达式吗?
簡介
Lambda 是一種可用于創建委托或表達式目錄樹類型的匿名函數。通過使用 lambda 表達式,可以寫入可作為參數傳遞或作為函數調用值返回的本地函數!
場景
比如有這樣一個場景,在給出的List集合中找出數字大于等于18的數字,假如我們不知道有linq這種東西!
我們預定義了一個輸出年齡的方法
void OutPutAge(Func<int,bool> func){foreach (var item in lstAges){if (func(item)){Console.WriteLine(item);}}}可以看出方法接收一個委托,該委托接收一個int類型的參數,并返回bool
那么我們首先會定義一個方法,當年齡大于18的時候我們返回true
使用
OutPutAge(IsAgeScrren);比如說我們現在知道這個方法僅僅傳遞一個方法的引用,我們很確定這個方法只會調用這一次,單獨為它創建一個方法感覺有些浪費,但是又必須用到這個方法,但是思考半天想不出該給這個方法取什么名字)。這個時候Lambda就派上用場了!
那么我們可以先簡化成匿名方法
現在我們把delegate關鍵字刪掉,在參數列表和方法體之間使用=>箭頭符號連接,這就形成了Lambda表達式
OutPutAge(?(int?age)?=>{?return?age?>?18;?});在函數式的編程語言中,如果最后一句是return表達式的話,我們最后可以把return和{}這個關鍵字省掉
c#也有類型推斷功能,我們在前面的 ? ?foreach (var item in lstAges)
這里c#可以自動推斷出 age是int類型,所以我們也可以把int類型直接省掉
就變成了,這樣看起來是不是就和我們平常的lambda表達式一樣了
OutPutAge( age => age > 18);那么我們再回到頭來看,如果我們知道Linq語句中的where方法其實幫我們做了很多事
我們再看一下Where的定義
他是使用了擴展方法和委托來完成的
source是?源元素的類型,predicate是接收一個int類型的參數,并返回bool變量。
最后
通過剛才的例子講解,也很容易推斷出Where源碼和我們預定義的方法差也差不多的!
public?static?IEnumerable<TSource>?Where<TSource>(this?IEnumerable<TSource>?source,?Func<TSource,?bool>?predicate){if (source == null)throw new Exception("數據源為空");foreach (var item in source){if (predicate(item) ){yield return item;}}}最后大家如果喜歡我的文章,還麻煩給個關注, 希望net生態圈越來越好!
總結
以上是生活随笔為你收集整理的你真的了解Lambda表达式吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#中缓存的使用
- 下一篇: 芒果TV会员,月卡最低9.9元,年卡最低