今天繼續(xù)分享泛型委托的Predicate<T>,上篇文章講了Action委托,這個比Action委托功不一樣的地方就是委托引用方法是Bool返回值的方法,Action為無返回值。首先我們看一下它的定義吧:
1 public delegate bool Predicate<T>(T obj);View Code
從其定義可以看到,此委托引用一個返回bool 值的方法,在實(shí)際開發(fā)中,通常使用Predicate<T>委托變量引用一個“判斷條件函數(shù)”,在判斷條件函數(shù)內(nèi)部書寫代碼表明函數(shù)參數(shù)所引用的對象應(yīng)滿足的條件,條件滿足時(shí),函數(shù)返回true.
我們在自己實(shí)現(xiàn)一下該委托:
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 打印學(xué)生信息(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
調(diào)用代碼如下:
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("原始總數(shù):"+teacher.Count);18 19 List<Teacher> teachers=teacher.MyFind(PredicateClass.打印教師信息);20 21 Console.WriteLine("過濾后總數(shù):"+teachers.Count);22 23 Console.WriteLine("原始總數(shù):" + students.Count);24 25 List<Student> studeList = students.MyFind(PredicateClass.打印學(xué)生信息);26 27 Console.WriteLine("過濾后總數(shù):" + studeList.Count);View Code
輸出效果:
以上效果可以看出通過自定義泛型委托來判斷和過濾一些信息,最后得到過濾后的數(shù)據(jù)。
以上代碼可以簡化:
1 //標(biāo)準(zhǔn)寫法 2 3 Console.WriteLine("原始總數(shù):" + 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("過濾后總數(shù):" + teachers.Count);24 25 //匿名方法26 27 Console.WriteLine("原始總數(shù):" + 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("過濾后總數(shù):" + teachers.Count);48 49 //Lambda表達(dá)式50 51 Console.WriteLine("原始總數(shù):" + 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("過濾后總數(shù):" + teachers.Count);View Code
輸出結(jié)果:
QQhm0EIDRmTASYwEqZEgNZJkBorMQJUbaQoTTWGiK010lZmhMjPUVobGSldb6WoLTW2hqcw0lZmmMtGUJqrSRFOaaCrTq5NmmmrjAVSliaowUeRGitxEkZsoinWM68dk+d/AuA5JZiTKjESpgSCZIUhmCOJpvHgaJ57Giafx4mm8ZHpdlniJYZ0NpYnfgNs4ML7624gRG9FiA1pkQAqmkfwpOG8Sxp2AcSeg3AlIywR0/YA7AeVOQriTEO4kuGWDxuaJhuaJhuYJEGcCxJ6oZ48DWeNA5jiQOQZgjgGaRmuaRmvoozX00WraSBVtpJI2UkkbqaAOV1CHyynDZZThcvJwOWW0nDJaTh0tp45WUMfKaWPl1LFy6lgZdbyMOl5KHSuljJVSxkrIGxSTR4vJo0Wk0SLSaBFxtHAdwmghYbSAMFpAGCkgjOS/Bv8K3HA+bjjvLXKx3yXnHYb+QbJ/Aob/l/9pcv7fIwsznIEeSkcNpSIHk+GDidD++HUP1fU+APaG1W5IyL9c51f2ykAl/wMG+usS8v7bEir/WxJ67aF1Ca176LWEXhvo+xKKrPsBCT1s2JBQPLg//rWEip2vJDSQAh94BB9IRayzYaB1Cb020BsJ4b4roVzscH2zsVne5x2aop9YEmpNQq1RqDWKOt8g1pneRvIKO+vCVyDaYC25D0juB5L6ACQ9gNBTi++uwepqMF21uJ5afE8tQQ8g9QEpg3X0ERBzrIE1AWZPQjiT0JZpOHcawZtBCmYwohm8xECQGkkyE1VhpinNDJwpsWViqc3sVgun1dLcZmlutza3W5s7bOtw2q2cdiu7zcJus7BaLSyNmakxsTRmVqtl/SS7zcJus7LbrOsPYGpMTeq/juoHYKiMr6ErjXSlkaYw0hQGqnyGIp+hyK
新聞熱點(diǎn)
疑難解答
圖片精選