C# 委托2

委托的定义:

    (1) 将方法作为变量使用的一种机制,就是将方法当作变量用(声明,赋值,传参)

      (2) 将变量当作方法来用,首先就要去声明变量,就要考虑变量的类型,就是(委托变量,对应方法的返回值,参数等),顾名思义:委托就是委托别人去干某些事情,下面是一个实例方法的实现 例如:我现在饿了,但是我很懒,就是不想出去买,所以这时候我可以委托室友帮我带一份,这样我就已经实现委托了

    

 class Program
    {
        //声明一个委托
        delegate int DelegateCompare(object o1, object o2);

        delegate int DelegateTotal(int num1, int num2);

        static void Main(string[] args)
        {

            //比较两个整数
            DelegateCompare del = intCompare;  //简写
            Console.WriteLine(del(1, 2));

            //比较两个字符的长度
            del = new DelegateCompare(strLengthCompare); //完整写法
            Console.WriteLine(del("123456", "admin"));

            del = PersonAgeCompare;  //简写
            Console.WriteLine(del(new Person("张三", 18), new Person("李四", 20)));

            /*-------------取最大值-----------*/
            DelegateCompare delMax;

            delMax = intCompare; //整数
            Console.WriteLine(GetMax(new object[] { 1, 5, 3, 6, 8, 7 }, delMax));

            delMax = strLengthCompare; //字符串长度
            Console.WriteLine(GetMax(new object[] { "aa", "a", "aaa", "aaaa", "aaaaaaaa", "a" }, delMax));

            delMax = PersonAgeCompare;  //Person类的Age属性
            Console.WriteLine(((Person)GetMax(new object[] { new Person("张三", 18), new Person("李四", 14), new Person("万物", 20) }, delMax)).Name);

            /*----------匿名委托----------*/

            //标准写法
            DelegateCompare del2 = delegate(object o1, object o2) { return (int)o1 - (int)o2; };
            Console.WriteLine("匿名委托" + del2(5, 3));
            //lambda 表达式
            DelegateCompare del3 = (object o1, object o2) => (int)o1 - (int)o2;   //del3 同等于Del4
            DelegateCompare del4 = (object o1, object o2) => { return (int)o1 - (int)o2; };

            /*--------系统委托-----------*/

            //lambda 表达式
            string[] names = { "agen", "balen", "coure", "apple" };
            string[] findNameA = Array.FindAll<string>(names, delegate(string v) { return v.StartsWith("a"); });
            string[] findNameB = Array.FindAll<string>(names, v => v.StartsWith("a"));
            Console.WriteLine(string.Join("-", findNameA));
            Console.WriteLine(string.Join("-", findNameB));

       //泛型集合Int转String数组
List<int> intList = new List<int>() { 1, 23, 4, 5, 56, 6, 6, 76, 7, 7 };
string[] str_array = intList.ConvertAll<string>((int i) => i.ToString()).ToArray(); 
/*----------------多播委托----------*/ //多播委托一般情况下 要求没有返回值, 若有, 则返回最后一个方法的返回值 DelegateTotal delTotal = He; delTotal += Cha; delTotal += Ji; Console.WriteLine(delTotal(2, 4)); Console.ReadKey(); } /// <summary> /// 获取array最大值 /// </summary> /// <param name="arr"></param> /// <param name="del"></param> /// <returns></returns> static object GetMax(object[] arr, DelegateCompare del) { if (arr.Length > 1) { object _max = arr[0]; for (int i = 1; i < arr.Length; i++) { if (del(_max, arr[i]) < 0) { _max = arr[i]; } } return _max; } return null; } /// <summary> /// 比较两个Person类的Age属性 大于0 o1大 等于0 相等 小于0 o2大 /// </summary> /// <param name="o1"></param> /// <param name="o2"></param> /// <returns></returns> static int PersonAgeCompare(object o1, object o2) { return ((Person)o1).Age - ((Person)o2).Age; } /// <summary> /// 比较两个字符串的长度 大于0 o1大 等于0 相等 小于0 o2大 /// </summary> /// <param name="o1"></param> /// <param name="o2"></param> /// <returns></returns> static int strLengthCompare(object o1, object o2) { return o1.ToString().Length - o2.ToString().Length; } /// <summary> /// 比较两个数的大小 大于0 o1大 等于0 相等 小于0 o2大 /// </summary> /// <param name="o1"></param> /// <param name="o2"></param> /// <returns></returns> static int intCompare(object o1, object o2) { return (int)o1 - (int)o2; } /// <summary> /// 求和 /// </summary> /// <param name="num1"></param> /// <param name="num2"></param> /// <returns></returns> static int He(int num1, int num2) { Console.WriteLine("----求和----"); return num1 + num2; } /// <summary> /// 求差 /// </summary> /// <param name="num1"></param> /// <param name="num2"></param> /// <returns></returns> static int Cha(int num1, int num2) { Console.WriteLine("----求差----"); return num1 - num2; } /// <summary> /// 求积 /// </summary> /// <param name="num1"></param> /// <param name="num2"></param> /// <returns></returns> static int Ji(int num1, int num2) { Console.WriteLine("----求积----"); return num1 * num2; } } //定义一个Person类 class Person { //姓名 private string name = ""; //年龄 private int age = 0; //构造方法 public Person(string PName, int PAge) { this.Name = PName; this.Age = PAge; } public int Age { get { return age; } set { age = value; } } public string Name { get { return name; } set { name = value; } } }