8.1.3 在 C# 中使用函数集合

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

8.1.3 在 C# 中使用函数集合

 

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

 

Listing 8.3 Executing tests (C#)

 

void TestClient(List<Func> tests, Client client) {
  int issuesCount = tests.Count(f => f(client));
  bool suitable = issuesCount <= 1;
  Console.WriteLine("Client: {0}/nOffer a loan: {1}",
    client.Name, suitable ? "YES" : "NO");
}

var john = new Client {
     Name = "John Doe", Income = 40000, YearsInJob = 1,
     UsesCreditCard = true, CriminalRecord = false
  };
TestClient(GetTests(), john);

 

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

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

C#8.0本质论:C#开发者必备的权威指南 C#8.0本质论》由C#专家Mark Michaelis撰写,是一本全面深入的C#技术书籍,适合从初学者到高级开发者的多层次读者。书中详细解析了C# 8.0的新特性,如可空引用类型、异步流等,并提供了丰富的示例代码和最佳实践。全书结构清晰,从基础知识到高级编程,涵盖了面向对象构造、集合LINQ、多线程处理等内容。作者通过系统性讲解和实用建议,帮助读者编写高质量、高效的C#代码。这本书不仅是一本教程,更是C#开发者的参考指南,适合希望在快速发展的编程世界中保持技术更新的开发者。 阅读详情

相关推荐

C#探索】C#中三种只读/不可变集合有什么用?

本文介绍了C#中三种只读/不可变集合的区别与应用:Readonly系列是对可变集合的简单封装,成本低适用于限制修改权限;Immutable系列采用函数式编程理念,通过创建新对象实现修改,适合多线程和版本追踪场景;Frozen系列是.NET8新增的真正不可变集合,优化读取性能但创建开销大,适用于只读常量表。文章通过历史演变、性能对比和典型场景分析,帮助开发者根据需求选择合适的集合类型。

scixing的博客 1022

c#实现启动操作系统上的程序或进程,并指定参数和谓词。

c#实现启动操作系统上的程序或进程,用Process类实现;并指定参数和谓词,用ProcessStartInfo和Verbs实现。

第壹章第6节 C#和TS语言对比-数组集合

本节比较长,但可以让我们一次性彻底掌握数组集合。编程的很大一部分工作,是访问和操作数据,而其中使用频率最高的数据形式,就是数组集合C#毕竟是后端语言,所以提供了更加丰富的集合类型,而且还有非常非常非常强大的LINQ查询语法,而TS就相对简陋些,毕竟是前端语言。文末补充了元组,这玩意我很少用,具体原因详见正文...

2401_85195613的博客 1233

c#自定义类的集合运算(Distinct, Except, Intersect, Union)

参考: 1、自定义比较函数–https://stackoverflow.com/questions/12988209/list-except-is-not-working 2、集合运算–https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/set-operations 进行集合运算时,linq需要比较集合元素的相等性。缺省状态下,Linq使用 Object.Equals 和Object.GetHashCo

鸟哥的博客 1555

【高效C#编程核心技能】:掌握Where与Select链式设计的3个关键原则

掌握C# LINQ 查询 Where 与 Select 链式技巧,提升数据处理效率。适用于集合过滤与投影场景,通过条件筛选、链式组合和延迟执行三大原则实现高效查询。代码简洁可读,性能优化显著,值得收藏。

FuncInk的博客 734

C#函数集合(二)

7、变量.Substring(参数1,参数2); 截取字串的一部分,参数1为左起始位数,参数2为截取几位。 如:string s1 = str.Substring(0,2); 8、String user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString(); 取远程用户IP地址 9、穿过代理服务器取远程用户真实IP地址: i...

diaoxie2012的博客 128

C#函数集合(四)

22、Math.Max(i,j) 取i与j中的最大值 如 int x=Math.Max(5,10); // x将取值 10 加一点吧 23、字串对比...... 加一点吧 23、字串对比一般都用: if(str1==str2){ } , 但还有别的方法: (1)、 string str1; str2 //语法: str1.EndsWith(str2); __检测字串...

diaoxie2012的博客 160

C# 集合

数组和Array类。数组的大小是固定的。如果元素个数是动态的,就应该使用集合类。List和ArrayList是与数组相当的集合类。还有其他类型的集合:队列、栈、链表和字典。集合接口和类型列表队列栈链表有序表字典LookupHashSet位数组性能。

若有博文对您有帮助,欢迎点赞关注,收藏评论。 1681

C#C#中的Array数组,List集合和ArrayList集合

类型安全性:Array和List提供类型安全,而ArrayList不提供。 大小调整:Array大小固定,List和 ArrayList大小可动态调整。 性能:Array通常性能最好,List次之,ArrayList由于装箱和拆箱可能性能最差。 使用场景:Array适合固定大小的集合,List适合动态大小且类型一致的集合,ArrayList适合需要存储不同类型对象的旧代码。

冰茶的博客 2155

【转载】 C#中List集合使用OrderByDescending方法对集合进行倒序排序

C#的List集合操作中,有时候需要针对List集合进行排序操作,如果是对List集合按照元素对象或者元素对象的某个属性进行倒序排序的话,可以使用OrderByDescending方法来实现,OrderByDescending方法属于List集合扩展方法,方法的调用形式为使用Lambda表达式语句。 (1)对List集合对象list1进行从大到小降序排序可使用下列语句: List list1 ...

weixin_39650424的博客 6839

C#效率革命】:深入剖析.NET 8集合操作的5种方式性能差距

掌握C#数据处理效率对比的终极方案!深入解析.NET 8中List、Span、Parallel等5种集合操作性能差异,涵盖高并发与大数据场景下的优化策略。提升执行速度与内存效率,C#性能调优必看,值得收藏。

Algorift的博客 839

C# 语言历史版本特性(C# 1.0到C# 8.0汇总)

C# 语言历史版本特性(C# 1.0到C# 8.0汇总) 历史版本 C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有17年的历史,语言本身具有丰富的特性,微软对其更新支持也十分支持。微软将C#提交给标准组织ECMA,C# 5.0目前是ECMA发布的最新规范,C# 6.0还是草案阶段,C# 7.1是微软当前提供的最新规范。 这里仅仅列个提纲,由于C# 5.0是具有ECMA标...

蓝叶菱的专栏 4824

8.1.2 在 C# 中把行为表示成函数

8.1.2 在 C# 中把行为表示成函数       我们前面提到过,以面向对象的方式理解函数,就是把它认为是有一个单独方法的接口。如果我们看一下清单 8.1 的代码,可以看到 IClientTest 就是这样声明的。这意味着,这个测试可以很容易地表示成一个简单的函数。在 C# 中,我们可以使用 lambda 函数来写测试:   Func isRiskyYearsInJob =   c

心想事成 607

C#集合、比较、转换

框出的几个接口,在 System.Collections 命名空间下,这几个接口提供了,基本的集合功能。我将解释框柱的四个接口,后文会介绍其他的。C#中的集合一般用于处理对象列表,功能比简单的数组要多,功能大多数是通过System.Collection 名称空间中的接口而获得的。我们可以在对象浏览器中找到(快捷键 Ctrl+W+J)

猪猪的博客 1533

c# list 容量_C# 基础知识系列- 3 集合数组

简单的介绍一下集合,通俗来讲就是用来保管多个数据的方案。比如说我们是一个公司的仓库管理,公司有一堆货物需要管理,有同类的,有不同类的,总而言之就是很多、很乱。我们对照集合的概念对仓库进行管理的话,那么 数组就是将一堆货整整齐齐的码在仓库的某个地方,普通列表也是如此;Set就是在仓库里有这么一个货架,每种货品只能放一个,一旦某种货品超过一个了货架就塌了;Dictionary字典呢,在一个货架上随机摆...

weixin_33881426的博客 1862

C#中的集合、哈希表、泛型集合、字典

集合ArrayList 集合集合可以看做是数组,可以将其看成“长度可变,具有很多方法的数组”。使用ArrayList,首先需要导入命名空间using.system.collections。通过添加和删除元素,就可以动态改变数组的长度。 优点:动态的增加和删除元素;实现了ICollection和IList接口;灵活的设置数组的大小。 ArrayList的构造器: ArrayLis...

梦蝶 1694
上一篇: 8.1.2 在 C# 中把行为表示成函数
下一篇: 8.1.4 在 F# 中使用函数列表
心想才事成
博客等级 码龄20年 104粉丝 420原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值