今天继续分享泛型委托的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
新闻热点
疑难解答