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


何为高阶函数

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


Map

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

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

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


Filter

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

这里我们只是少了一个泛型参数,对应的第一参数的是能够接收T类型返回bool类型的函数(


Predicate


也是.NET自带的,可能我们用惯了


Func





Action


,并且利用


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中使用的


select





where





aggregate


就是对应着函数式编程中的map、filter和fold。

除声明外,跑步客文章均为原创,转载请以链接形式标明本文地址
  C#函数式编程中的标准高阶函数详解

本文地址:  http://www.paobuke.com/develop/c-develop/pbk23158.html

相关内容

C#实现redis读写的方法

C#中两个byte如何相加

C# DateTime.ToString根据不同语言生成相应的时间格式

c# ArrayList的使用方法小总结


C#实现的调用DOS命令操作类实例

C#图像伪彩色处理方法

C#文字换行的实现方法

C#中string用法实例详解

时间: 2024-10-05 05:06:24

C#函数式编程中的标准高阶函数详解的相关文章

python 高阶函数详解。

1,概念: Iterable 和 IteratorIterable 表示该变量可以被 for in 进行迭代.Iterator 表示该变量可以被 next(o)进行迭代(上一个表示有限迭代,下一个表示一个惰性的迭代概念,可以无限迭代.)一般的Iterable 的变量有:L=[{},[],(1,),{3:4},{3,4}]for x in L:print(isinstance(x,Iterable))print(isinstance(x,Iterator)) truefalse 可见,基础变量Li

Android总结篇系列:Activity中几个主要函数详解

专注Android领域开发. 仰望星空,同时需要脚踏实地. ——好记性不如烂博客 Android总结篇系列:Activity中几个主要函数详解 Activity作为Android系统中四大基本组件之一,包含大量的与其他的各大组件.intent.widget以及系统各项服务等之间的交互的函数.在此,本文主要选取实际项目开发中常用的,但完全理解又需要有一定深入了解的几个函数进行讲解,后续本文会根据需要不断更新. 1. startActivityForResult / onActivityResult

Python学习笔记八:文件操作(续),文件编码与解码,函数,递归,函数式编程介绍,高阶函数

文件操作(续) 获得文件句柄位置,f.tell(),从0开始,按字符数计数 f.read(5),读取5个字符 返回文件句柄到某位置,f.seek(0) 文件在编辑过程中改变编码,f.detech() 获取文件编码,f.encoding() 获取文件在内存中的编号,f.fileno() 获取文件终端类型(tty.打印机等),f.isatty() 获取文件名,f.name() 判断文件句柄是否可移动(tty等不可移动),f.seekable() 判断文件是否可读,f.readable() 判断文件是

linux中fork()函数详解

 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事.    一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同.相当于克隆了一个自己. 我们来看一个例子: [cpp] view plain copy /* *  f

linux中fork()函数详解(原创!!实例讲解) (转载)

 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程, 也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事. 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都 复制到新的新进程中,只有少数值与原来的进程的值不同.相当于克隆了一个自己. 我们来看一个例子: /* * fork_test.c * version 1 *

linuxC中fork()函数详解

一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事.    一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同.相当于克隆了一个自己. 我们来看一个例子: 1 /* 2 * fork_test.c 3 * versi

[置顶] linux中fork()函数详解(原创!!实例讲解)

分类: 计算机系统 linux2010-06-01 23:35 60721人阅读 评论(105) 收藏 举报 linux2010存储  一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事.    一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新进程中,

linux中fork()函数详解【转】

转自:http://blog.csdn.net/jason314/article/details/5640969 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事.    一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程

linux中fork()函数详解(转)

转自:http://blog.csdn.net/jason314/article/details/5640969 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事.    一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程