利用泛型委托实现比较大小

利用泛型委托实现比较大小

  /// <summary>
    /// 利用委托比较大小
    /// </summary>
    class Program
    {
        //1.定义学生类
        public class Student
        {
            public string Name { get; set; }
            public int Age { get; set; }
            public int Num { get; set; }
        }
        //2.定义比较Student的委托
        public delegate bool CompareDelegate(Student first, Student second);

        //3.声明委托引用的方法
        //比较年龄
        public static bool Younger(Student s1, Student s2) => s1.Age <= s2.Age;
        //比较学号
        public static bool NumSmaller(Student s1, Student s2) => s1.Num <= s2.Num;

        //4.定义比较以及输出方法
        public static void SortStudent(List<Student> sList, CompareDelegate CompareMethod)
        {
            //委托实例的调用
            if (CompareMethod(sList[0], sList[1]))//等价于CompareMethod.Invoke(sList[0],  List[1])----反射的Invoke()
            {
                //sList[0]已经在sList[1]前面了,所以什么也不用做
            }
            else
            {
                sList.Reverse();//交换位置
            }
            //获取排名采用的比较方法的名称
            Console.WriteLine($"\r\n按照 {CompareMethod.Method.Name} 排名:");
            //打印排序后的链表
            foreach (Student s in sList)
                Console.WriteLine($"{s.Name} {s.Age} {s.Num} ");
        }

        static void Main(string[] args)
        {
            //1.实例化学生对象
            Student s1 = new Student() { Name = "Tom", Age = 10, Num = 1001 };
            Student s2 = new Student() { Name = "Jerry", Age = 9, Num = 1002 };
            List<Student> sList = new List<Student>();
            sList.Add(s1);
            sList.Add(s2);

            //2.委托实例化以及调用
            //2.1以下两种方法等价
            CompareDelegate myCompareDelegate1 = new CompareDelegate(Younger);//方法的引用,不需要带(). 带() 为方法的调用
            SortStudent(sList, myCompareDelegate1);
            //委托推断
            CompareDelegate myCompareDelegate2 = Younger;
            SortStudent(sList, myCompareDelegate2);

            //2.2委托的实例化与使用,以下两种方法等价
            CompareDelegate myCompareDelegate = NumSmaller;//采用比较学号的方法
            SortStudent(sList, myCompareDelegate);
            //使用委托推断,与上两行等价
            SortStudent(sList, NumSmaller);
            
            //2.3匿名委托
            //匿名委託,直接把方法写在实例化代码中,不必在另一个地方定义方法
            CompareDelegate anonymousCompare = delegate (Student s3, Student s4)
            {
                return s3.Num <= s4.Num;
            };
            SortStudent(sList, anonymousCompare);//匿名方法并不是真的“没有名字”的,而是编译器为我们自动取一个名字

            //2.4 Lamadbe 表达式,是对匿名委托的优化
            //当匿名委托只有一行代码时,{} 和 return 可以省略
            CompareDelegate LambdaCompare1 = (s4, s5) => s4.Age <= s5.Age;
            SortStudent(sList, LambdaCompare1);

            //当匿名委托为多行代码时,{} 和 return 不能省略
            CompareDelegate LambdaCompare2 = (s4, s5) =>
            {
                return s4.Age <= s5.Age;
            };
            SortStudent(sList, LambdaCompare1);

        }
    }

 

posted @ 2021-05-14 14:04  码农阿亮  阅读(95)  评论(0编辑  收藏  举报