欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#函數(shù)式編程中的標(biāo)準(zhǔn)高階函數(shù)詳解

 更新時間:2015年01月28日 09:53:08   投稿:junjie  
這篇文章主要介紹了C#函數(shù)式編程中的標(biāo)準(zhǔn)高階函數(shù)詳解,本文講解了何為高階函數(shù)、Map、 Filter、Fold等內(nèi)容,需要的朋友可以參考下

何為高階函數(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ù)的作用就是將列表中的每項(xiàng)從A類型轉(zhuǎn)換到B類型,并形成一個新的類型。下面我們可以看看在FCSLib中是如何實(shí)現(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提取出來,單獨(dú)形成一個列表。

 Filter

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

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

 Fold

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

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

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

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

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

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

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

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

相關(guān)文章

最新評論