Predicate

Predicate泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素。
通过查看源码发现

Predicate  Array

先来看一下Array.FindAll

构建一个字符串类型的数组进行演示测试

第一种方式

            string[] arrayString = new string[]{"One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten"};string[] arrayResult = Array.FindAll(arrayString, (c) => c.Length > 3);

如上图所示FindAll两个参数第一个就是数组(字符串数组,int数组等等),第二个就是委托Predicate有一个参数。

上面的演示测试功能就是 测试字符串数组中的项的长度大于3的就返回,可以看出应该是有6个

下面来看一下测试结果

(c) => c.Length > 3 此处这就是一个lambda表达式第二种方式
        public void PredicateArrayTest(){string[] arrayString = new string[]{"One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten"};string[] arrayResult = Array.FindAll(arrayString, (c) => c.Length > 3);string[] arrayResultMethod = Array.FindAll(arrayString, GetString);}private bool GetString(string item){if (item.Length > 3){return true;}return false;}

通过一个GetString方法,也就是通过委托进行传递方法的方式

查看效果,结果是一样的

第三种方式
 string[] arrayResultDelegate = Array.FindAll(arrayString, delegate(string c) { return c.Length > 3; });

直接通过匿名代理可以达到同样的效果。

查看源代码可以发现,Array数组的其他很多方法同样都使用了Predicate委托

再写一个简单的小例子进行巩固一下对Precidate委托的使用

        public string PredicateNewTest(Predicate<string> item ){string[] arrayString = new string[]{"One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten"};foreach (string str in arrayString){if (item(str)){return str;}}return null;//return arrayString.FirstOrDefault(str => item(str));
        }[TestMethod]public void PredicateNewTest(){string str = PredicateNewTest((c) => { return c.Length > 3; });}

通过下面的函数进行调用之后返回

Predicate  List

对List的实现其实和Array的实现原理几乎完全一样,暂时就不实现了,可以自己想想吧,之后看情况,自己再补上。

Func

可以很清楚的看出,封装一个带有返回 TResult 参数指定的类型值的方法,它有多个重载。下面我们通过委托来处理一下3*5=15的过程。

        public delegate string MultiTest(int a, int b);[TestMethod]public  void ActionTest(){MultiTest muliti = new MultiTest(MultiMethod);string result=muliti(3, 5);}public string MultiMethod(int a,int b){return (a*b).ToString();}

其中:定义一个有两个int类型参数的,返回值为字符串的委托。声明一个乘法的方法,并且返回字符串,然后调用。

那么现在我们来使用Func来优化的代码是什么样呢

        public string MultiMethod(int a,int b){return (a*b).ToString();}[TestMethod]public  void FuncTest(){Func<int,int,string> func=new Func<int, int, string>(MultiMethod);string result = func(3, 5);}

结果为

是不是很简单呢,那么你自己也试一下吧。

Action

Action与Func极为类似,只不过Action执行没有返回值而已,那么应该就更简单一些了,在此就不进行示例讲解了。

 

C#泛型委托Predicate、Action、Func相关推荐

  1. 泛型委托 Predicate/Func/Action

    Predicate 泛型委托   表示定义一组条件并确定指定对象是否符合这些条件的方法.此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素. 看看下面它的定义: // Summ ...

  2. 使用.NET中的Action及Func泛型委托

    原文 http://www.cnblogs.com/skm-blog/archive/2013/05/24/3096294.html 委托,在C#编程中占有极其重要的地位,委托可以将函数封装到委托对象 ...

  3. 泛型委托Action和一些常见用法

    泛型委托Action Action的定义   在.Net2.0里面,Action只有一个定义 public delegate void Action(T arg); 定义一个普通的委托格式是: pub ...

  4. C# 委托 (一)—— 委托、 泛型委托与Lambda表达式

    C# 委托 (一)-- 委托. 泛型委托与Lambda表达式 2018年08月19日 20:46:47 wnvalentin 阅读数 2992 版权声明:此文乃博主之原创.鄙人才疏,望大侠斧正.此文可 ...

  5. 七天学习计划_c#_[2][3][4][5]委托、事件、委托与事件的区别、泛型委托、Func\Action\predicate

    由于委托之前的博客已经详细写了,这里就简单的过一遍,复习一下: 了解委托 基于委托开发事件驱动程序变得非常简单. 使用委托可以大大简化多线程编程难度. 理解委托 委托也可以看做成一种数据类型,可以定义 ...

  6. C#中的三种委托方式:Func委托,Action委托,Predicate委托

    C#中的三种委托方式:Func委托,Action委托,Predicate委托. Func,Action,Predicate全面解析 首先来说明Func委托,通过MSDN我们可以了解到,Func委托有如 ...

  7. 第十节:委托和事件(2)(泛型委托、Func和Action、事件及与委托的比较)

    一. 泛型委托 所谓的泛型委托,即自定义委托的参数可以用泛型约束,同时内置委托Func和Action本身就是泛型委托. 将上一个章节中的Calculator类中的方法用自定义泛型委托重新实现一下. 1 ...

  8. 泛型委托Action与ActionT

    以前都是自己写委托,其实系统内部给我们系统了委托的. Action --委托的非泛型版本就是一个无参数无返回值的委托. Action<T>--委托的泛型版本是一个无返回值,但是参数个数及类 ...

  9. C#基础18:内置委托类型Action和Func

    前文:https://blog.csdn.net/Jaihk662/article/details/97130647(匿名方法与Lambda表达式) 一.Action泛型委托 Action 为 Sys ...

最新文章

  1. Asp.Net MVC 自定义的MVC框架(非EF操作数据库)
  2. linux c sysconf函数 得到系统配置
  3. 并不是所有的 Github 项目写在简历上都加分
  4. C专家编程--读书笔记六 运行时数据结构
  5. (android实战)Service 生命周期和使用注意项
  6. 隐身专家 FreeEIM 合作版
  7. 用idea给java项目打jar包
  8. 解决Linux中crontab不执行ntpdate问题
  9. 浅谈MySQL表类型
  10. c语言做简单的水果店程序,怎么开发一款生鲜水果小程序?水果店+小程序该如何组合运营?...
  11. 网络协议笔记-数据链路层
  12. MyBatis源码阅读(五) ---Mapper接口的获取过程
  13. 工业机器人技术试题_工业机器人考试试题库
  14. Rose环境和用例图
  15. IntelliJ IDEA 字体配置常用快捷键
  16. 树莓派4安装minecraft java 1.12.2
  17. 如何把直播嵌入微信公众账号
  18. Ubutu Mosquitto部署和相关的配置(支持websocket)
  19. python对英雄皮肤进行图片采集~
  20. scriptmanager

热门文章

  1. AndroidStudio_百度人脸识别离线SDK_代码分析_使用流程_随时更新---Android原生开发工作笔记217
  2. 大数据之-Hadoop源码编译_源码编译具体流程_以及编译步骤---大数据之hadoop工作笔记0046
  3. uniapp---为什么使用uniapp_以及uniapp开发的app展示_使用hbuilderx简单搭建一个uniapp_一次开发_小程序_Android_IOS_快应用通用工作笔记002
  4. 基于Spring Security的认证方式_创建工程_Spring Security OAuth2.0认证授权---springcloud工作笔记119
  5. Seata多微服务互相调用_全局分布式事务使用案例_seata之原理剖析---微服务升级_SpringCloud Alibaba工作笔记0066
  6. Python工作笔记007---win10安装Python3.7.3_以及用pycharm创建Python项目_以及对System interpreter理解
  7. Linux学习笔记003----linux yum命令详解
  8. html5学习笔记---03. Canvas简介,Canvas的使用方法
  9. [Caffe]:关于 Error parsing text-format Caffe.NetParameter: xxx.xx : Expected interger or identifier.
  10. mysql数据库建order,group表时的错误