8.1.3 在 C# 中使用函数集合

考虑对客户进行贷款时,我们想要执行所有测试,并统计返回 true 的测试数(指高风险)。如果数为零个或一,程序就建议贷款。通常常的命令式解决方案是,声明一个变量,使用 foreach 语句枚举测试;在循环体内,执行测试,如果返回 true,变量就增加;使用 LINQ的扩展方法 Count,实现可以更优雅(清单 8.3)。

清单 8.3 执行测试 (C#)

void TestClient(List<Func<Client,bool>> tests, Client client) {

int issuesCount = tests.Count(f=> f(client));    [1]

bool suitable = issuesCount <= 1;                 |

Console.WriteLine("Client:{0}\nOffer a loan: {1}",  | 输出测试结果

client.Name, suitable ?"YES" : "NO");          |

}

var john = new Client {    <-- 使用对象初始化器,创建 Client

Name = "JohnDoe", Income = 40000, YearsInJob = 1,

UsesCreditCard =true, CriminalRecord = false

};

TestClient(GetTests(), john);  <-- 给这个客户提供贷款吗?

使用函数式术语,Count 是高阶函数;它的参数为条件,统计条件为 true 的元素的数量。我们使用它来统计有多少测试认为客户不适合贷款[1]。在示例中,集合中的元素是函数,因此,条件的参数必须是函数,返回为布尔值。我们写的 lambda 函数,执行作为参数值传递来的函数,指定客户作为参数值,返回测试的结果作为条件的结果。统计失败的测试数以后,计算并输出结果就很容易了。描述它的工作原理(即使在这个相对简单的情况下)很复杂,但如果你认为正在尝试处理每个元素,就不难理解。

我们前面提到过,示例的 F#版本实质上是相同的。这是因为所有必要的功能,如高阶函数,lambda 函数,以及在集合中保存函数的能力,在 C# 3.0 中也都是可用的。现在,我们就来看看 F# 代码。

时间: 2024-09-30 01:29:40

8.1.3 在 C# 中使用函数集合的相关文章

C++中的函数对象(一)

STL中的函数对象,大多数STL类属算法(以及某些容器类)可以以一个函数对象作为参数.引入函数对象的目的是为了使算法的功能富于变化,从而增强算法的通用性. 所谓函数对象,是指一段代码实体,它可以不带参数,也可以带有若干参数,其功能是获得一个值,或者改变操作的状态.在C++编程中,任何普通的函数都满足这个定义,而且,任何一个重载了运算符operator()的类的对象也都满足这一定义,称为函数对象. 普通函数 int multfun(int x, int y) { return x*y; } 或者下

Oracle 中 decode 函数用法

Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 THEN RETURN(翻译值2) ......ELSIF 条件=值n THEN RETURN(翻译值n)ELSE RETURN(缺省值)END IFdecode(字段或字段的运算,值1,值2,值3) 这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值

js中一些函数(一)【丫头, 今天去哪儿了呢,好些没有】

Math.Rondom()   ==>  0 到 1 之间的小数 Math.floor(x)  ==>  小于或者等于 x 的整数(即转换成整数后是不能比 x 大的整数) setInterval(hanshu,1000)  ==>  意思为调用下面的 hanshu(), 间隔时间为 1000 ms(毫秒) js中一些函数(一)[丫头, 今天去哪儿了呢,好些没有],码迷,mamicode.com

Mysql中的函数

阅读目录 什么是函数 与存储过程的区别 mysql自带函数 自定义函数 什么是函数 mysql中的函数与存储过程类似,都是一组SQL集: 与存储过程的区别 函数可以return值,存储过程不能直接return,但是有输出参数可以输出多个返回值: 函数可以嵌入到sql语句中使用,而存储过程不能: 函数一般用于实现较简单的有针对性的功能(如求绝对值.返回当前时间等),存储过程用于实现复杂的功能(如复杂的业务逻辑功能): mysql自带函数 mysql本身已经实现了一些常见的函数,如数学函数.字符串函

javascript中所有函数的参数都是按值传递的

[javascript中所有函数的参数都是按值传递的] 参考:http://www.jb51.net/article/89297.htm

程序代码中退出函数exit()与返回函数return ()的区别

  exit(0):正常运行程序并退出程序:   exit(1):非正常运行导致退出程序:   return():返回函数,若在主函数中,则会退出函数并返回一值.  解析: 1. return返回函数值,是关键字: exit 是一个函数. 2. return是语言级别的,它表示了调用堆栈的返回:而exit是系统调用级别的,它表示了一个进程的结束. 3. return是函数的退出(返回):exit是进程的退出. 4. return是C语言提供的,exit是操作系统提供的(或者函数库中给出的).ex

JavaScript闭包中闭包函数this的指向

阅读文章前, 请先阅读阮一峰老师的这篇文章http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html 前人写过的, 而且写得很好, 就没必要重复下去了. 只加一些阮老师的文章里没有说的.顺便总结一下. 引用一句话: "闭包就是functions that return function"(出处已经忘记啦) 闭包的类型: 循环闭包, 函数闭包 闭包的特点: 外部访问函数内部的值, 函数内部变量不被回收

想精度高,可以考虑用c语言中的函数gettimeofday

大家好: 在 win32 + bcb 时, 有个 GetTickCount() 返回第统启动到现在的 tick, 单位 ms.请问在 Linux + qt5 怎样实现呢? 如果用 QDateTime , 精度只能到秒,而且运行过程中,如果用户改充了系统时间,就会出错了. 用QElapsedTimer. 想精度高,可以考虑用c语言中的函数gettimeofday,微秒级精度 #include <sys/time.h>int gettimeofday(struct timeval*tv, stru

如何使用 JDBC 调用存储在数据库中的函数或存储过程

JDBC调用存储过程步骤:1 通过Connection对象的prepareCall()方法创建一个CallableStatement对象的实例.在使用Connection对象的prepareCall()方法时,需要传入一个String类型的字符串,该字符串用于指明如何调用存储过程{?= call <procedure-name>[(<arg1>,<arg2>, ...)]} {call <procedure-name>[(<arg1>,<a