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执行没有返回值而已,那么应该就更简单一些了,在此就不进行示例讲解了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

这是EnterLib PIAB的BUG吗?

在默认的情况下,EnterLib的PIAB采用基于TransparentProxy/RealProxy的机制实现对方法调用的拦截,进而实现了对横切关注点(Cro...

22160
来自专栏跟着阿笨一起玩NET

DBNull.Value与Null的区别

Null是.net中无效的对象引用。 DBNull是一个类。DBNull.Value是它唯一的实例。它指数据库中数据为空(<NULL>)时,在.net中的值。 ...

18210
来自专栏Java与Android技术栈

Java8 Stream的总结

Stream是Java 8新增的接口,Stream可以认为是一个高级版本的 Iterator。它代表着数据流,流中的数据元素的数量可以是有限的,也可以是无限的。

12420
来自专栏恰童鞋骚年

.NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法

开篇:在上一篇中,我们了解了自动属性、隐式类型、自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类、匿名方法以及常用的扩展方法。虽然,都是很常见的东西,...

12930
来自专栏博客园

.NET Core中延迟单例另一种写法【.NET Core和.NET Framework的beforefieldinit差异】

   前段时间在反编译代码时无意间看到在类中有一个BeforeFieldInit特性,处于好奇的心态查了查这个特性,发现这是一个关于字段初始化时间的特性【提前初...

19440
来自专栏性能与架构

认识一下 Java 11

可能很多人现在 Java8 的新特性还没用熟呢,Java 11 就已经来了,下面一起来看下 Java 11 的几个新特性:

14520
来自专栏Golang语言社区

厚土Go学习笔记 | 28. go语言没有类 却可以在结构体或任意类型定义方法

在go语言中没有类。可是,是有方法的。 给结构体定义方法,在对应的 func 和方法名之间,加上方法的接收者就可以了。 比如,我们定义了一个结构体 type V...

38580
来自专栏蘑菇先生的技术笔记

探索c#之递归APS和CPS

31270
来自专栏blackheart的专栏

[C#1] 11-接口

接口与继承 CLR规定一个类型只能有一个基类型,这种继承成为单继承; 接口继承是指一个类型继承的是接口中的方法签名,而非方法实现,通常称为实现接口; 接口仅仅是...

21990
来自专栏blackheart的专栏

[C#6] 4-string 插值

0. 目录 C#6 新增特性目录 1. 老版本的代码 1 internal class Person 2 { 3 public string Na...

21260

扫码关注云+社区

领取腾讯云代金券