c#-冒泡排序与通用委托

    class Employee
    {
        public string name;
        public int salary;

        public static bool SortSalary(Employee e0,Employee e1)//把这个方法作为委托传到排序方法中可实现通用排序
        {
            if (e0.salary
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 冒泡排序的优化
{
    /// 
    /// 通过新增一个do...while循环
    /// 利用循环中发生了交换就改变swapper为真,否则为false来防止当排完序后不会又重复循环
    /// 升级通用排序,思想是利用传递一个委托方法作为参数,放在if中的条件判断中来比较对象之间的排序
    /// 在这里举个例子添加一个employee类,有name和salary属性,利用salary进行排序
    /// 多播委托就是一个委托可以携带多个方法一起调用,就是广播的性质一样
    /// 调用一个委托可以调用方法链,但是如果方法链中某一个方法抛出了异常,在调用终止
    /// 方法链中只有最后一个方法的返回值可以被返回,不过一般都为void
    /// 调用可以利用GetInvocationList返回一个委托数组遍历分开来一个一个调用,还可以传形参
    /// 
    class Program
    {
        private static bool swapper = true;
        static void sortArray(int[] arrays)
        {
            do
            {
                swapper = false;
                for (int i = 0; i < arrays.Length-1; i++)
                {
                    if (arrays[i]>arrays[i+1])
                    {
                        var temp = arrays[i];
                        arrays[i] = arrays[i+1];
                        arrays[i + 1] = temp;
                        swapper = true; 
                    }
                }
            } while (swapper);
        }

        static void genericSortArray(T[] arrays,Func compareMethod)
        {
            do
            {
                swapper = false;
                for (int i = 0; i < arrays.Length - 1; i++)
                {
                    if (compareMethod(arrays[i],arrays[i+1]))
                    {
                        var temp = arrays[i];
                        arrays[i] = arrays[i + 1];
                        arrays[i + 1] = temp;
                        swapper = true;
                    }
                }
            } while (swapper);
        }

        /// 
        /// 多播委托
        /// 

        public static void printName()
        {
            Console.WriteLine("Miku");
          //  throw new Exception();//程序会中断,什么都输入不了
        }
        public static void printotherName()
        {
            Console.WriteLine("轩墨");
        }
                
        static void Main(string[] args)
        {
            //int[] myArrays = new int[] { 12, 4, 1525, 242, 1 };
            //sortArray(myArrays);
            //foreach (var i in myArrays)
            //{
            //    Console.Write(i + " ");
            //}
            Employee[] myEmployees = new Employee[]
            {
                new Employee("ice",100),
                new Employee("icecold",200),
                new Employee("icecold",20),
                new Employee("icecold",30),
            };
            genericSortArray(myEmployees,Employee.SortSalary);
            foreach (var e in myEmployees)
            {
                Console.WriteLine(e);
            }
            Action temp;
            temp = printName;
            temp += printotherName;
            //temp();
            Delegate[] dels = temp.GetInvocationList();
            foreach (Delegate del in dels)
            {
                del.DynamicInvoke();//利用这个分开调用多播委托
            }
            Console.ReadKey();
        }
    }
}

 

你可能感兴趣的:(c#)