首页 > 学院 > 开发设计 > 正文

C#语法糖之第六篇: 泛型委托- Predicate<T>、Func<T>

2019-11-17 03:01:18
字体:
来源:转载
供稿:网友

C#语法糖之第六篇: 泛型委托- PRedicate<T>、Func<T>

今天继续分享泛型委托的Predicate<T>,上篇文章讲了Action委托,这个比Action委托功不一样的地方就是委托引用方法是Bool返回值的方法,Action为无返回值。首先我们看一下它的定义吧:

1 public delegate  bool Predicate<T>(T obj);
View Code

从其定义可以看到,此委托引用一个返回bool 值的方法,在实际开发中,通常使用Predicate<T>委托变量引用一个“判断条件函数”,在判断条件函数内部书写代码表明函数参数所引用的对象应满足的条件,条件满足时,函数返回true.

我们在自己实现一下该委托:

 1 public static class PredicateClass 2  3     { 4  5         public delegate bool PanDuan<T>(T t); 6  7         public static List<T> MyFind<T>(this List<T> tList, PanDuan<T> find) 8  9         {10 11             List<T> newTs = new List<T>();12 13             foreach (T t in tList)14 15             {16 17                 if (find(t))18 19                 {20 21                     newTs.Add(t);22 23                 }24 25             }26 27             return newTs;28 29         }30 31         public static bool 打印学生信息(Student stu)32 33         {34 35             if (stu.Age > 20) return true;36 37             return false;38 39         }40 41         public static bool 打印教师信息(Teacher teacher)42 43         {44 45             if (teacher.Age > 40 && teacher.TeachNum=="001") return true;46 47             return false;48 49         }50 51     }
View Code

调用代码如下:

 1  List<Student> students=new List<Student>(); 2  3             students.Add(new Student{ StuNum = "001",StuName = "zhangsan",Age = 20}); 4  5             students.Add(new Student { StuNum = "002", StuName = "lisi", Age = 21 }); 6  7             students.Add(new Student { StuNum = "003", StuName = "wangwu", Age = 22 }); 8  9             List<Teacher> teacher=new List<Teacher>();10 11             teacher.Add(new Teacher{TeachNum = "004",TeachName = "teacher1",Age = 50});12 13             teacher.Add(new Teacher { TeachNum = "005", TeachName = "teacher2", Age = 51 });14 15             teacher.Add(new Teacher { TeachNum = "006", TeachName = "teacher3", Age = 52 });16 17             Console.WriteLine("原始总数:"+teacher.Count);18 19             List<Teacher> teachers=teacher.MyFind(PredicateClass.打印教师信息);20 21             Console.WriteLine("过滤后总数:"+teachers.Count);22 23             Console.WriteLine("原始总数:" + students.Count);24 25             List<Student> studeList = students.MyFind(PredicateClass.打印学生信息);26 27             Console.WriteLine("过滤后总数:" + studeList.Count);
View Code

输出效果:

以上效果可以看出通过自定义泛型委托来判断和过滤一些信息,最后得到过滤后的数据。

以上代码可以简化:

 1 //标准写法 2  3 Console.WriteLine("原始总数:" + teacher.Count); 4  5             List<Teacher> teachers = teacher.MyFind( 6  7                 new PredicateClass.PanDuan<Teacher>(delegate(Teacher t) 8  9                 {10 11                     if (t.Age>21&&t.TeachNum=="001")12 13                     {14 15                         return true;16 17                     }18 19                     return false;20 21                 }));22 23             Console.WriteLine("过滤后总数:" + teachers.Count);24 25 //匿名方法26 27             Console.WriteLine("原始总数:" + teacher.Count);28 29             List<Teacher> teachers1 = teacher.MyFind(30 31                delegate(Teacher t)32 33                 {34 35                     if (t.Age > 21 && t.TeachNum == "001")36 37                     {38 39                         return true;40 41                     }42 43                     return false;44 45                 });46 47             Console.WriteLine("过滤后总数:" + teachers.Count);48 49 //Lambda表达式50 51             Console.WriteLine("原始总数:" + teacher.Count);52 53             List<Teacher> teachers2 = teacher.MyFind(54 55                u=>56 57                {58 59                    if (u.Age > 21 && u.TeachNum == "001")60 61                    {62 63                        return true;64 65                    }66 67                    return false;68 69                });70 71             Console.WriteLine("过滤后总数:" + teachers.Count);
View Code

输出结果:

QQhm0EIDRmTASYwEqZEgNZJkBorMQJUbaQoTTWGiK010lZmhMjPUVobGSldb6WoLTW2hqcw0lZmmMtGUJqrSRFOaaCrTq5NmmmrjAVSliaowUeRGitxEkZsoinWM68dk+d/AuA5JZiTKjESpgSCZIUhmCOJpvHgaJ57Giafx4mm8ZHpdlniJYZ0NpYnfgNs4ML7624gRG9FiA1pkQAqmkfwpOG8Sxp2AcSeg3AlIywR0/YA7AeVOQriTEO4kuGWDxuaJhuaJhuYJEGcCxJ6oZ48DWeNA5jiQOQZgjgGaRmuaRmvoozX00WraSBVtpJI2UkkbqaAOV1CHyynDZZThcvJwOWW0nDJaTh0tp45WUMfKaWPl1LFy6lgZdbyMOl5KHSuljJVSxkrIGxSTR4vJo0Wk0SLSaBFxtHAdwmghYbSAMFpAGCkgjOS/Bv8K3HA+bjjvLXKx3yXnHYb+QbJ/Aob/l/9pcv7fIwsznIEeSkcNpSIHk+GDidD++HUP1fU+APaG1W5IyL9c51f2ykAl/wMG+usS8v7bEir/WxJ67aF1Ca176LWEXhvo+xKKrPsBCT1s2JBQPLg//rWEip2vJDSQAh94BB9IRayzYaB1Cb020BsJ4b4roVzscH2zsVne5x2aop9YEmpNQq1RqDWKOt8g1pneRvIKO+vCVyDaYC25D0juB5L6ACQ9gNBTi++uwepqMF21uJ5afE8tQQ8g9QEpg3X0ERBzrIE1AWZPQjiT0JZpOHcawZtBCmYwohm8xECQGkkyE1VhpinNDJwpsWViqc3sVgun1dLcZmlutza3W5s7bOtw2q2cdiu7zcJus7BaLSyNmakxsTRmVqtl/SS7zcJus7LbrOsPYGpMTeq/juoHYKiMr6ErjXSlkaYw0hQGqnyGIp+hyK

上一篇:C#:字段与属性

下一篇:C#笔记

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表