如何使用 C# 中的 Action, Func,Predicate
译文链接:https://www.infoworld.com/article/3057152/how-to-work-with-action-func-and-predicate-delegates-in-csharp.html?nsdr=true
委托是一个类型安全的函数指针,它可以引用与委托具有相同签名的方法。委托常用于实现回调方法或者事件机制,在C#中一般用 "delegate" 关键字声明。你可以声明一个和类平级的委托,也可以嵌套在类中。
Func 和 Action 是什么,如何使用?
两者最基本的区别是,前者适合那些需要带返回值的委托,后者适合那些不带返回值的委托。
Func 所引用的方法接收一个或者多个入参并带有一个返回值,Action所引用的方法接收一个或者多个参数并且没有返回值,换句话说,你的委托所引用的方法没有返回值,这时候适合用 Action。
Predicate所引用的方法接收一个或者多个泛型参数并且返回一个 bool 值,你可以假定它等价于 Func<T,bool>
,Predicate 常用于对 collection 进行一组条件检索。
C# 中使用 Action
你可以使用 委托 去实现事件和回调方法,C#委托非常类似于C++中的函数指针,但是 C# 中的 委托 是类型安全的,你可以将方法作为参数传递给委托从而让委托指向该方法。
下面的代码片段展示了 Action 委托的语法结构。
Action<TParameter>
接下来的代码清单展示了如何使用 Action 委托,当下面的代码执行结束后会在控制台打印 Hello !!!
。
static void Main(string[] args){Action<string> action = new Action<string>(Display);action("Hello!!!");Console.Read();}static void Display(string message){Console.WriteLine(message);}
C# 中使用 Func
现在我们一起学习下 Func 委托,下面是 Func 的语法结构。
Func<TParameter, TOutput>
接下来的代码片段展示了如何在 C# 中使用 Func 委托,最终方法会打印出 Hra(基本薪资的 40%) 的值,基本薪资是作为参数传下去的,如下代码所示:
static void Main(string[] args){Func<int, double> func = new Func<int, double>(CalculateHra);Console.WriteLine(func(50000));Console.Read();}static double CalculateHra(int basic){return (double)(basic * .4);}
值得注意的是,Func 委托的第二个参数表示方法的返回值,在上面这个例子中,它就是计算后的 Hra 值,作为 double 型返回。
C# 中使用 Predicate
Predicate 委托常用于检索 collection,下面是 Predicate 的语法结构。
Predicate<T>
值得注意的是, Predicate<T>
差不多等价于 Func<T,bool>
。
考虑下面的 Customer 实体类。
class Customer{public int Id { get; set; }public string FirstName { get; set; }public string LastName { get; set; }public string Address { get; set; }public string City { get; set; }public string State { get; set; }public string Country { get; set; }}
接下来生成一个 customer 集合并且丢一些数据进去,如下代码:
List<Customer> custList = new List<Customer>();custList.Add(new Customer { Id = 1, FirstName = "Joydip", LastName = "Kanjilal", State = "Telengana", City = "Hyderabad", Address = "Begumpet", Country = "India" });custList.Add(new Customer { Id = 2, FirstName = "Steve", LastName = "Jones", State = "OA", City = "New York", Address = "Lake Avenue", Country = "US" });
接下来是完整的代码片段展示了如何使用 Predicate 去检索集合。
static void Main(string[] args){List<Customer> custList = new List<Customer>();custList.Add(new Customer { Id = 1, FirstName = "Joydip", LastName = "Kanjilal", State = "Telengana", City = "Hyderabad", Address = "Begumpet", Country = "India" });custList.Add(new Customer { Id = 2, FirstName = "Steve", LastName = "Jones", State = "OA", City = "New York", Address = "Lake Avenue", Country = "US" });Predicate<Customer> hydCustomers = x => x.Id == 1;Customer customer = custList.Find(hydCustomers);Console.WriteLine(customer.FirstName);Console.Read();}
当上面的代码被成功执行, 控制台将会输出 Joydip
。
如何使用 C# 中的 Action, Func,Predicate相关推荐
- C# 中的 Action, Func, EventHandler 和 EventHandlerTEventArgs
C# 中常用内置委托 Action, Func, EventHandler 和 EventHandler<TEventArgs> 介绍 Action Delegate 封装一个没有返回值的 ...
- 浅谈C#中常见的委托Func,Action,Predicate(转)
一提到委托,浮现在我们脑海中的大概是听的最多的就是类似C++的函数指针吧,呵呵,至少我的第一个反应是这样的. 关于委托的定义和使用,已经有诸多的人讲解过,并且讲解细致入微,尤其是张子阳的那一篇.我就不 ...
- Func vs. Action vs. Predicate [复制]
本文翻译自:Func vs. Action vs. Predicate [duplicate] This question already has an answer here: 这个问题在这里已有答 ...
- Delegate,Action,Func,匿名方法,匿名委托,事件 (转载)
Delegate,Action,Func,匿名方法,匿名委托,事件 (转载) 一.委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本 ...
- spark的RDD中的action(执行)和transformation(转换)两种操作中常见函数介绍
参考文章:spark的RDD中的action(执行)和transformation(转换)两种操作中常见函数介绍 spark常见的RDD 1. 函数概览 2. 常见的Transformations 操 ...
- Struts2中的action类
Struts2中的action类 action类在Struts2中承担了Model(模型)的角色,主要用于处理业务逻辑并存放HTTP请求处理过程中各个变量的值. 在Struts2里面,Action充当 ...
- Struts2中的Action
多数的MVC框架中的Control层,都是一个Java对象.按照惯例,我们通常会把这个层次上面的Java对象统称为Action层.本篇文章,我们就来简单介绍一下Struts2中Action的相关内容. ...
- 【struts2】struts2中的Action详解
在传统的MVC框架(如struts1.Spring等)中,Action都需要实现特定的接口,这些接口都是MVC框架定义的,实现MVC的接口会与MVC框架耦合.struts2的Action要灵活得多,可 ...
- [Redux/Mobx] 举例说明怎么在redux中定义action?
[Redux/Mobx] 举例说明怎么在redux中定义action? 利用actionCreator // 用户选择需要显示的subreddit export const SELECT_SUBRED ...
最新文章
- shutting down mysql_mysql报这是什么错?
- 2011百度之星初赛B圆环
- jsp+servlet 导出Excel表格
- php短信接口源码,比较简单,但也实用
- 用Python做科学计算
- 辗转相除求最大公约数
- 15.django之Django-Rest-Framework
- WAI-ARIA对自动完成小部件的支持
- 前端学习(537):多列布局4横跨多列
- python 博弈论 社会网络_【 统计应用 】 社会网络分析SNA报告-学习
- 日常踩坑:odule ‘tensorflow‘ has no attribute ‘placeholder‘解决方案
- 进阶05 常用数据结构
- Unity 的 Scroll View组件
- 狗狗自带餐具能有多可爱
- keep sb updated_keep you update 和keep you updated哪个正确
- 公司地址变更,税务变更,公司搬家了怎么变更企业信息
- JavaWeb——动态页面技术(JSP/EL/JSTL)
- echarts 多图表的自适应窗口大小,自动缩放
- 读书笔记--Neural Networks and Deep Learning(CH1)
- maven 开发 ejb ear
热门文章
- Maximum upload size exceede上传文件大小超出解决
- 线程的语法 (event,重要)
- IE6.0、IE7.0 、FireFox 在样式中的不同写法.doc
- JavaScript组件之JQuery(A~Z)教程(基于Asp.net运行环境)[示例代码下载](一)
- 极客时间和极客学院_极客历史记录的本周:Twitter的诞生,OS X十周年以及太空停留时间最长的时代即将结束...
- 浅谈javascript递归(白话版)
- IROS 2017上,这些厂商将会给我们展示什么样的黑科技?
- VMware Workstation 12新建虚拟机
- 前端几个笔试题及答案(bd)
- 基于HTML5手机上下滑动翻页特效