日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

C#函数式编程之标准高阶函数

發(fā)布時間:2025/3/21 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#函数式编程之标准高阶函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

何為高階函數(shù)

? ? ? 大家可能對這個名詞并不熟悉,但是這個名詞所表達(dá)的事物卻是我們經(jīng)常使用到的。只要我們的函數(shù)的參數(shù)能夠接收函數(shù),或者函數(shù)能夠返回函數(shù),當(dāng)然動態(tài)生成的也包括在內(nèi)。那么我們就將這類函數(shù)叫做高階函數(shù)。但是今天我們的標(biāo)題并不是高階函數(shù),而是標(biāo)準(zhǔn)高階函數(shù),既然加上了這個標(biāo)準(zhǔn),就意味著在函數(shù)式編程中有一套標(biāo)準(zhǔn)的函數(shù),便于我們每次調(diào)用。而今天我們將會介紹三個標(biāo)準(zhǔn)函數(shù),分別為Map、Filter、Fold。

?

Map

這個函數(shù)的作用就是將列表中的每項從A類型轉(zhuǎn)換到B類型,并形成一個新的類型。下面我們可以看看在FCSLib中是如何實現(xiàn)的:

相信很多人應(yīng)該都能夠看懂這段代碼,僅僅只是循環(huán)list數(shù)據(jù)。然后調(diào)用convert函數(shù)轉(zhuǎn)換,最后通過yield將其組成一個列表返回。下面我們通過一個簡單的例子來演示下如何使用這個標(biāo)準(zhǔn)高階函數(shù):

我們通過聲明了一個數(shù)組data,然后利用map函數(shù)將其中的ID提取出來,單獨形成一個列表。

?

Filter

? ? ? 通過名字應(yīng)該能夠猜出他大概的含義了,就是用來過濾數(shù)據(jù)的。相信一些人能夠根據(jù)上面寫出這個標(biāo)準(zhǔn)高階函數(shù)的具體實現(xiàn),當(dāng)然這里不管讀者有沒有寫出,我們都來看看FCSLib中是如何實現(xiàn)的:

? ? ? 這里我們只是少了一個泛型參數(shù),對應(yīng)的第一參數(shù)的是能夠接收T類型返回bool類型的函數(shù)Predicate也是.NET自帶的,可能我們用慣了FuncAction,并且利用Func<T,bool>也可以實現(xiàn)一樣的效果。),而語句主要是在循環(huán)后調(diào)用了predicate去判斷是否滿足條件,如果滿足條件則返回。

?

Fold

? ? ? 這個標(biāo)準(zhǔn)高階函數(shù)可能會比較難,因為它分為了左折疊和右折疊兩種。接收的參數(shù)有三個,分別是起始值,累加函數(shù),列表。大致的執(zhí)行過程就是在第一次調(diào)用我們的累加函數(shù)時將起始值作為一個參數(shù),而列表中的第一個值作為第二個參數(shù)去調(diào)用我們的累加函數(shù),累加函數(shù)計算出結(jié)果,而這個結(jié)果將作為下一次調(diào)用累加函數(shù)時的第一參數(shù),而第二個參數(shù)則是列表中的下一項,以此類推。所以通過這個高階函數(shù)我們可以直接計算出列表中每項數(shù)據(jù)累加后的結(jié)果,而在FCSLib中的具體實現(xiàn)則如下所示:

? ? ? 通過查看源代碼我們也可以得出之前的執(zhí)行流程,在第一次的時候v的值為startValue,而之后就會將accmulator函數(shù)的返回值保存進(jìn)v,這樣下一次執(zhí)行accmulator時就作為第一個參數(shù)傳入。下面我們通過一個簡單的例子來看看如何使用:

?

左折疊完成之后對應(yīng)的還有一個右折疊,當(dāng)然根據(jù)名字也可以猜出。就是從list的末尾開始進(jìn)行循環(huán),所以我們可以這樣來實現(xiàn)FoldR:

這里還要指出的就是左折疊和右折疊是最常用的算法之一,他完全可以實現(xiàn)像我們之前介紹過的Map和Filter,而只要按照下面這種方式寫即可:

? ? ? 這里我們就是利用Fold函數(shù)的一個特性來實現(xiàn)的,因為累加函數(shù)每次都會將上一次計算得出的結(jié)果傳遞給下一個累加函數(shù)(new List<R>()我們直接將其作為起始值傳入),最后我們都會通過return x將這個列表返回,這樣下一次再調(diào)用這個累加函數(shù)之后x依然是同一個列表。對應(yīng)的還有Filter的實現(xiàn):

而具體的調(diào)用方式則和Map,Filter是一致的,并沒有什么特別大的區(qū)別。

?

關(guān)于Linq中的Map、Filter和Fold

其實函數(shù)式編程已經(jīng)在不知不覺中慢慢的進(jìn)入到我們的生活中,其實我們經(jīng)常在Linq中使用的selectwhereaggregate就是對應(yīng)著函數(shù)式編程中的map、filter和fold。

?

《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的C#函数式编程之标准高阶函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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