博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#泛型委托Predicate、Action、Func
阅读量:4974 次
发布时间:2019-06-12

本文共 3196 字,大约阅读时间需要 10 分钟。

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
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
func=new Func
(MultiMethod); string result = func(3, 5); }

结果为

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

Action

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

 

转载于:https://www.cnblogs.com/aehyok/p/3382291.html

你可能感兴趣的文章
背景色渐变(兼容各浏览器)
查看>>
Redis中7种集合类型应用场景
查看>>
MariaDB 和 MySQL 比较
查看>>
MYSQL: 1292 - Truncated incorrect DOUBLE value: '184B3C0A-C411-47F7-BE45-CE7C0818F420'
查看>>
Java JPA @Transient 在Hibernate中应用
查看>>
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
查看>>
springMVC Controller 参数映射
查看>>
JDK1.8源码分析02之阅读源码顺序
查看>>
java使用jsp servlet来防止csrf 攻击的实现方法
查看>>
缓存穿透/击穿/雪崩/降级
查看>>
我的作品
查看>>
【bzoj题解】2186 莎拉公主的困惑
查看>>
Protocol Buffer学习笔记
查看>>
Update 语句
查看>>
HBuilder打包Android apk 支付不了问题解决
查看>>
poj2594——最小路径覆盖
查看>>
程序员口述:我是如何工作三年后跳槽到美团的?
查看>>
欧拉函数
查看>>
关于SQL2008 “不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的标进行了更改或者启用了‘阻止保存要求重新创建表的更改’” 解决方案...
查看>>
php文件操作(上传文件)2
查看>>