C#函数式编程中的标准高阶函数详解

 更新时间:2015年01月28日 09:53:08   投稿:junjie  
这篇文章主要介绍了C#函数式编程中的标准高阶函数详解,本文讲解了何为高阶函数、Map、 Filter、Fold等内容,需要的朋友可以参考下

何为高阶函数

      大家可能对这个名词并不熟悉,但是这个名词所表达的事物却是我们经常使用到的。只要我们的函数的参数能够接收函数,或者函数能够返回函数,当然动态生成的也包括在内。那么我们就将这类函数叫做高阶函数。但是今天我们的标题并不是高阶函数,而是标准高阶函数,既然加上了这个标准,就意味着在函数式编程中有一套标准的函数,便于我们每次调用。而今天我们将会介绍三个标准函数,分别为Map、Filter、Fold。

 Map

这个函数的作用就是将列表中的每项从A类型转换到B类型,并形成一个新的类型。下面我们可以看看在FCSLib中是如何实现的:

相信很多人应该都能够看懂这段代码,仅仅只是循环list数据。然后调用convert函数转换,最后通过yield将其组成一个列表返回。下面我们通过一个简单的例子来演示下如何使用这个标准高阶函数:

我们通过声明了一个数组data,然后利用map函数将其中的ID提取出来,单独形成一个列表。

 Filter

      通过名字应该能够猜出他大概的含义了,就是用来过滤数据的。相信一些人能够根据上面写出这个标准高阶函数的具体实现,当然这里不管读者有没有写出,我们都来看看FCSLib中是如何实现的:

      这里我们只是少了一个泛型参数,对应的第一参数的是能够接收T类型返回bool类型的函数(Predicate也是.NET自带的,可能我们用惯了FuncAction,并且利用Func<T,bool>也可以实现一样的效果。),而语句主要是在循环后调用了predicate去判断是否满足条件,如果满足条件则返回。

 Fold

      这个标准高阶函数可能会比较难,因为它分为了左折叠和右折叠两种。接收的参数有三个,分别是起始值,累加函数,列表。大致的执行过程就是在第一次调用我们的累加函数时将起始值作为一个参数,而列表中的第一个值作为第二个参数去调用我们的累加函数,累加函数计算出结果,而这个结果将作为下一次调用累加函数时的第一参数,而第二个参数则是列表中的下一项,以此类推。所以通过这个高阶函数我们可以直接计算出列表中每项数据累加后的结果,而在FCSLib中的具体实现则如下所示:

      通过查看源代码我们也可以得出之前的执行流程,在第一次的时候v的值为startValue,而之后就会将accmulator函数的返回值保存进v,这样下一次执行accmulator时就作为第一个参数传入。下面我们通过一个简单的例子来看看如何使用:

 左折叠完成之后对应的还有一个右折叠,当然根据名字也可以猜出。就是从list的末尾开始进行循环,所以我们可以这样来实现FoldR:

这里还要指出的就是左折叠和右折叠是最常用的算法之一,他完全可以实现像我们之前介绍过的Map和Filter,而只要按照下面这种方式写即可:

      这里我们就是利用Fold函数的一个特性来实现的,因为累加函数每次都会将上一次计算得出的结果传递给下一个累加函数(new List<R>()我们直接将其作为起始值传入),最后我们都会通过return x将这个列表返回,这样下一次再调用这个累加函数之后x依然是同一个列表。对应的还有Filter的实现:

而具体的调用方式则和Map,Filter是一致的,并没有什么特别大的区别。

 关于Linq中的Map、Filter和Fold

其实函数式编程已经在不知不觉中慢慢的进入到我们的生活中,其实我们经常在Linq中使用的selectwhereaggregate就是对应着函数式编程中的map、filter和fold。

相关文章

  • C#中无边框窗体移动的简单实例

    C#中无边框窗体移动的简单实例

    拖动无边框窗体Form至桌面任何位置,有需要的朋友可以参考一下
    2013-08-08
  • C#中把日志导出到txt文本的简单实例

    C#中把日志导出到txt文本的简单实例

    这篇文章介绍了C#中把日志导出到txt文本的简单实例,有需要的朋友可以参考一下
    2013-10-10
  • Unity实现弹球打砖块游戏

    Unity实现弹球打砖块游戏

    这篇文章主要为大家详细介绍了Unity实现弹球打砖块游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C#获取哈希加密生成随机安全码的类实例

    C#获取哈希加密生成随机安全码的类实例

    这篇文章主要介绍了C#获取哈希加密生成随机安全码的类,涉及C#哈希加密及字符串操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • Unity 百度AI实现人像动漫化效果

    Unity 百度AI实现人像动漫化效果

    这篇文章主要介绍了Unity如何接入百度AI接口, 运用对抗生成网络技术,为用户量身定制千人千面的二次元动漫形象,并支持通过参数设置,生成二次元动漫人像。感兴趣的可以学习一下
    2022-01-01
  • C#交错数组浅析

    C#交错数组浅析

    这里介绍C#交错数组,数组是具有同一类型的一组值,数组是引用类型的,因此存在内存堆中。数组中的元素值可以在定义数组时赋予,也可以在定义数组后对单个元素进行赋值
    2012-09-09
  • C#使用StreamReader和StreamWriter类读写操作文件

    C#使用StreamReader和StreamWriter类读写操作文件

    这篇文章介绍了C#使用StreamReader和StreamWriter类读写操作文件的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#如何修改项目名图文详解

    C#如何修改项目名图文详解

    最近开发工作接近尾声,客户来要求更换项目的名称,差不多要变更整个解决方案中项目名称,引用等等,这个工作量还是很大的,这篇文章主要给大家介绍了关于C#如何修改项目名的相关资料,需要的朋友可以参考下
    2023-01-01
  • C#实现设置电脑显示器参数

    C#实现设置电脑显示器参数

    这篇文章主要为大家详细介绍了如何利用C#实现设置电脑显示器参数,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • C#比较二个数组并找出相同或不同元素的方法

    C#比较二个数组并找出相同或不同元素的方法

    这篇文章主要介绍了C#比较二个数组并找出相同或不同元素的方法,涉及C#针对数组的交集、补集等集合操作相关技巧,非常简单实用,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11

最新评论