C#泛型委托Predicate、Action、Func
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相关推荐
- 泛型委托 Predicate/Func/Action
Predicate 泛型委托 表示定义一组条件并确定指定对象是否符合这些条件的方法.此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素. 看看下面它的定义: // Summ ...
- 使用.NET中的Action及Func泛型委托
原文 http://www.cnblogs.com/skm-blog/archive/2013/05/24/3096294.html 委托,在C#编程中占有极其重要的地位,委托可以将函数封装到委托对象 ...
- 泛型委托Action和一些常见用法
泛型委托Action Action的定义 在.Net2.0里面,Action只有一个定义 public delegate void Action(T arg); 定义一个普通的委托格式是: pub ...
- C# 委托 (一)—— 委托、 泛型委托与Lambda表达式
C# 委托 (一)-- 委托. 泛型委托与Lambda表达式 2018年08月19日 20:46:47 wnvalentin 阅读数 2992 版权声明:此文乃博主之原创.鄙人才疏,望大侠斧正.此文可 ...
- 七天学习计划_c#_[2][3][4][5]委托、事件、委托与事件的区别、泛型委托、Func\Action\predicate
由于委托之前的博客已经详细写了,这里就简单的过一遍,复习一下: 了解委托 基于委托开发事件驱动程序变得非常简单. 使用委托可以大大简化多线程编程难度. 理解委托 委托也可以看做成一种数据类型,可以定义 ...
- C#中的三种委托方式:Func委托,Action委托,Predicate委托
C#中的三种委托方式:Func委托,Action委托,Predicate委托. Func,Action,Predicate全面解析 首先来说明Func委托,通过MSDN我们可以了解到,Func委托有如 ...
- 第十节:委托和事件(2)(泛型委托、Func和Action、事件及与委托的比较)
一. 泛型委托 所谓的泛型委托,即自定义委托的参数可以用泛型约束,同时内置委托Func和Action本身就是泛型委托. 将上一个章节中的Calculator类中的方法用自定义泛型委托重新实现一下. 1 ...
- 泛型委托Action与ActionT
以前都是自己写委托,其实系统内部给我们系统了委托的. Action --委托的非泛型版本就是一个无参数无返回值的委托. Action<T>--委托的泛型版本是一个无返回值,但是参数个数及类 ...
- C#基础18:内置委托类型Action和Func
前文:https://blog.csdn.net/Jaihk662/article/details/97130647(匿名方法与Lambda表达式) 一.Action泛型委托 Action 为 Sys ...
最新文章
- Asp.Net MVC 自定义的MVC框架(非EF操作数据库)
- linux c sysconf函数 得到系统配置
- 并不是所有的 Github 项目写在简历上都加分
- C专家编程--读书笔记六 运行时数据结构
- (android实战)Service 生命周期和使用注意项
- 隐身专家 FreeEIM 合作版
- 用idea给java项目打jar包
- 解决Linux中crontab不执行ntpdate问题
- 浅谈MySQL表类型
- c语言做简单的水果店程序,怎么开发一款生鲜水果小程序?水果店+小程序该如何组合运营?...
- 网络协议笔记-数据链路层
- MyBatis源码阅读(五) ---Mapper接口的获取过程
- 工业机器人技术试题_工业机器人考试试题库
- Rose环境和用例图
- IntelliJ IDEA 字体配置常用快捷键
- 树莓派4安装minecraft java 1.12.2
- 如何把直播嵌入微信公众账号
- Ubutu Mosquitto部署和相关的配置(支持websocket)
- python对英雄皮肤进行图片采集~
- scriptmanager
热门文章
- AndroidStudio_百度人脸识别离线SDK_代码分析_使用流程_随时更新---Android原生开发工作笔记217
- 大数据之-Hadoop源码编译_源码编译具体流程_以及编译步骤---大数据之hadoop工作笔记0046
- uniapp---为什么使用uniapp_以及uniapp开发的app展示_使用hbuilderx简单搭建一个uniapp_一次开发_小程序_Android_IOS_快应用通用工作笔记002
- 基于Spring Security的认证方式_创建工程_Spring Security OAuth2.0认证授权---springcloud工作笔记119
- Seata多微服务互相调用_全局分布式事务使用案例_seata之原理剖析---微服务升级_SpringCloud Alibaba工作笔记0066
- Python工作笔记007---win10安装Python3.7.3_以及用pycharm创建Python项目_以及对System interpreter理解
- Linux学习笔记003----linux yum命令详解
- html5学习笔记---03. Canvas简介,Canvas的使用方法
- [Caffe]:关于 Error parsing text-format Caffe.NetParameter: xxx.xx : Expected interger or identifier.
- mysql数据库建order,group表时的错误