• C#泛型委托


    泛型委托,可以分开看,是泛型和委托的组合。

    泛型:

    对于泛型的使用之前的文章已经写了,可以参考C#之泛型_故里2130的博客-CSDN博客,不清楚的可以先看一看。

    委托:

    这个比较简单,从delegate关键字到匿名委托方法,再到Action和Func,Action是无返回值的委托,Func是有返回值的委托,现在基本上都是基于Action和Func来写委托的,有些和业务逻辑连接起来写匿名委托方法。

    现在我们看一个案例

    1.建立一个控制台程序,建立student类

     

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. namespace ConsoleApp4
    7. {
    8. public class Student
    9. {
    10. public int ID { get; set; }
    11. public string name { get; set; }
    12. public int age { get; set; }
    13. public string sex { get; set; }
    14. public string grade { get; set; }
    15. }
    16. }

    2.我们初始化数据后,分别进行查询操作

    进行3次查询后,然后分别输出对应的名字,这样是我们平时的做法,一点错误都没有。可以看到都是where的功劳,现在我们可以使用泛型委托自己自定义一个和where一样的功能。

    只要遇到代码有重复的逻辑,就可以使用委托

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. namespace ConsoleApp4
    5. {
    6. static class Program
    7. {
    8. static void Main(string[] args)
    9. {
    10. List student = new List();
    11. student.Add(new Student() { age = 20, grade = "一班", ID = 1, name = "张三", sex = "男" });
    12. student.Add(new Student() { age = 21, grade = "一班", ID = 2, name = "李四", sex = "女" });
    13. student.Add(new Student() { age = 22, grade = "二班", ID = 3, name = "王五", sex = "女" });
    14. student.Add(new Student() { age = 23, grade = "二班", ID = 4, name = "老六", sex = "男" });
    15. var stu = student.Where(s => s.grade == "一班");
    16. foreach (var item in stu)
    17. {
    18. Console.WriteLine(item.name);
    19. }
    20. Console.WriteLine("==============分界线==============");
    21. var stu1 = student.Where(s => s.sex == "男");
    22. foreach (var item in stu1)
    23. {
    24. Console.WriteLine(item.name);
    25. }
    26. Console.WriteLine("==============分界线==============");
    27. var stu2 = student.Where(s => s.sex == "男" && s.age > 20);
    28. foreach (var item in stu2)
    29. {
    30. Console.WriteLine(item.name);
    31. }
    32. }
    33. }
    34. }

    3. 结果

    4. 建立一个WhereNew类,表示泛型委托类

    特别要注意,Invoke是执行方法,传入参数,返回bool值

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. namespace ConsoleApp4
    7. {
    8. public static class WhereNew
    9. {
    10. public static IEnumerable<T> NewWhere<T>(this IEnumerable items, Funcbool> func)
    11. {
    12. List ls = new List();
    13. foreach (var item in items)
    14. {
    15. if (func.Invoke(item)) //执行方法,传入参数,返回bool值
    16. {
    17. ls.Add(item);
    18. }
    19. }
    20. return ls;
    21. }
    22. }
    23. }

    5.使用

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. namespace ConsoleApp4
    5. {
    6. static class Program
    7. {
    8. static void Main(string[] args)
    9. {
    10. List student = new List();
    11. student.Add(new Student() { age = 20, grade = "一班", ID = 1, name = "张三", sex = "男" });
    12. student.Add(new Student() { age = 21, grade = "一班", ID = 2, name = "李四", sex = "女" });
    13. student.Add(new Student() { age = 22, grade = "二班", ID = 3, name = "王五", sex = "女" });
    14. student.Add(new Student() { age = 23, grade = "二班", ID = 4, name = "老六", sex = "男" });
    15. //var stu = student.Where(s => s.grade == "一班");
    16. IEnumerable stu = student.NewWhere(s => s.grade == "一班");
    17. foreach (var item in stu)
    18. {
    19. Console.WriteLine(item.name);
    20. }
    21. Console.WriteLine("==============分界线==============");
    22. //var stu1 = student.Where(s => s.sex == "男");
    23. IEnumerable stu1 = student.NewWhere(s => s.sex == "男");
    24. foreach (var item in stu1)
    25. {
    26. Console.WriteLine(item.name);
    27. }
    28. Console.WriteLine("==============分界线==============");
    29. //var stu2 = student.Where(s => s.sex == "男" && s.age > 20);
    30. IEnumerable stu2 = student.NewWhere(s => s.sex == "男" && s.age > 20);
    31. foreach (var item in stu2)
    32. {
    33. Console.WriteLine(item.name);
    34. }
    35. }
    36. }
    37. }

    6.效果,和之前where的效果是一样的

      

    从中我们可以看到where和自定义的NewWhere,功能是一样的,也就是说where也是用了泛型委托。泛型就是T,委托就是func。所以,我们可以传递一个类型的数据进去,然后再传递一个方法进去,自动就加工返回值了。

    1. public static IEnumerable<T> NewWhere<T>(this IEnumerable items, Funcbool> func)
    2. {
    3. List ls = new List(); //T就是泛型,委托就是func
    4. foreach (var item in items)
    5. {
    6. if (func.Invoke(item)) //执行方法,传入参数,返回bool值
    7. {
    8. ls.Add(item);
    9. }
    10. }
    11. return ls;
    12. }

     

     

     

     

     

     

     

     

  • 相关阅读:
    CentOS7 PXE配合Kickstart实现无人值守自动装机 超详细
    猿创征文|Mybatis的注解实现复杂映射开发
    聊一聊装饰者模式
    跑步耳机哪款好用,五款适合跑步的排行榜
    KekeBlog项目实战后台模块(二)(已完结)
    PyTorch中,卷积层、池化层、转置卷积层输出特征图形状计算公式总结
    70.Qt QWaitCondition多线程同步介绍及案例分析
    近源渗透学习
    明星艺人建立百科的步骤和技巧
    IDEA中的项目点击Run可以正常运行,一点击Debug就卡死了
  • 原文地址:https://blog.csdn.net/u012563853/article/details/126538101