译文链接: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相关推荐

  1. C# 中的 Action, Func, EventHandler 和 EventHandlerTEventArgs

    C# 中常用内置委托 Action, Func, EventHandler 和 EventHandler<TEventArgs> 介绍 Action Delegate 封装一个没有返回值的 ...

  2. 浅谈C#中常见的委托Func,Action,Predicate(转)

    一提到委托,浮现在我们脑海中的大概是听的最多的就是类似C++的函数指针吧,呵呵,至少我的第一个反应是这样的. 关于委托的定义和使用,已经有诸多的人讲解过,并且讲解细致入微,尤其是张子阳的那一篇.我就不 ...

  3. Func vs. Action vs. Predicate [复制]

    本文翻译自:Func vs. Action vs. Predicate [duplicate] This question already has an answer here: 这个问题在这里已有答 ...

  4. Delegate,Action,Func,匿名方法,匿名委托,事件 (转载)

    Delegate,Action,Func,匿名方法,匿名委托,事件 (转载) 一.委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本 ...

  5. spark的RDD中的action(执行)和transformation(转换)两种操作中常见函数介绍

    参考文章:spark的RDD中的action(执行)和transformation(转换)两种操作中常见函数介绍 spark常见的RDD 1. 函数概览 2. 常见的Transformations 操 ...

  6. Struts2中的action类

    Struts2中的action类 action类在Struts2中承担了Model(模型)的角色,主要用于处理业务逻辑并存放HTTP请求处理过程中各个变量的值. 在Struts2里面,Action充当 ...

  7. Struts2中的Action

    多数的MVC框架中的Control层,都是一个Java对象.按照惯例,我们通常会把这个层次上面的Java对象统称为Action层.本篇文章,我们就来简单介绍一下Struts2中Action的相关内容. ...

  8. 【struts2】struts2中的Action详解

    在传统的MVC框架(如struts1.Spring等)中,Action都需要实现特定的接口,这些接口都是MVC框架定义的,实现MVC的接口会与MVC框架耦合.struts2的Action要灵活得多,可 ...

  9. [Redux/Mobx] 举例说明怎么在redux中定义action?

    [Redux/Mobx] 举例说明怎么在redux中定义action? 利用actionCreator // 用户选择需要显示的subreddit export const SELECT_SUBRED ...

最新文章

  1. shutting down mysql_mysql报这是什么错?
  2. 2011百度之星初赛B圆环
  3. jsp+servlet 导出Excel表格
  4. php短信接口源码,比较简单,但也实用
  5. 用Python做科学计算
  6. 辗转相除求最大公约数
  7. 15.django之Django-Rest-Framework
  8. WAI-ARIA对自动完成小部件的支持
  9. 前端学习(537):多列布局4横跨多列
  10. python 博弈论 社会网络_【 统计应用 】 社会网络分析SNA报告-学习
  11. 日常踩坑:odule ‘tensorflow‘ has no attribute ‘placeholder‘解决方案
  12. 进阶05 常用数据结构
  13. Unity 的 Scroll View组件
  14. 狗狗自带餐具能有多可爱
  15. keep sb updated_keep you update 和keep you updated哪个正确
  16. 公司地址变更,税务变更,公司搬家了怎么变更企业信息
  17. JavaWeb——动态页面技术(JSP/EL/JSTL)
  18. echarts 多图表的自适应窗口大小,自动缩放
  19. 读书笔记--Neural Networks and Deep Learning(CH1)
  20. maven 开发 ejb ear

热门文章

  1. Maximum upload size exceede上传文件大小超出解决
  2. 线程的语法 (event,重要)
  3. IE6.0、IE7.0 、FireFox 在样式中的不同写法.doc
  4. JavaScript组件之JQuery(A~Z)教程(基于Asp.net运行环境)[示例代码下载](一)
  5. 极客时间和极客学院_极客历史记录的本周:Twitter的诞生,OS X十周年以及太空停留时间最长的时代即将结束...
  6. 浅谈javascript递归(白话版)
  7. IROS 2017上,这些厂商将会给我们展示什么样的黑科技?
  8. VMware Workstation 12新建虚拟机
  9. 前端几个笔试题及答案(bd)
  10. 基于HTML5手机上下滑动翻页特效