• 冒泡排序C#实现,使用委托,包括三种方式:Fun<>,匿名方法,Lambda表达式


    冒泡排序是一种简单的排序方法,适合于小量数字排序,对于大量数字(超过10个),还有更高效的排序方法。
    这里的实现的冒泡排序,需实现功能:
    不仅数字排序,还要对任意对象排序

    示例:

    • 对People对象的Age(年龄)排序
    • 对Student对象的Score(分数)排序

    People:

        public class People
        {
            public string Name { get; set; }
            public int Age { get; set; }
            public People(string name, int age)
            {
                Name = name;
                Age = age;
            }
            public static bool CompareAge(People p1, People p2)
            {
                return p1.Age < p2.Age;
            }
            public override string ToString()
            {
                return string.Format("[people] name:{0},age:{1}", Name, Age);
            }
        } 
    

    Student:

        public class Student
        {
            public string Name { get; set; }
            public float Score { get; set; }
            public Student(string name, float score)
            {
                Name = name;
                Score = score;
            }
            public static bool CompareScore(Student s1, Student s2)
            {
                return s1.Score < s2.Score;
            }
            public override string ToString()
            {
                return string.Format("[student] name:{0},score:{1}",Name,Score);
            }
        } 
    

    冒泡排序的实现,如果对Fun<>的委托写法不懂,最后有说明。

        public static class Storter_Fun
        {
            public static void Sort<T>(IList<T> sortArray, Func<T, T, bool> comparision)
            {
                bool swapped = true;
                do
                {
                    swapped = false;
                    for (int i = 0; i < sortArray.Count - 1; i++)
                    {
                        if (comparision(sortArray[i + 1], sortArray[i]))
                        {
                            T temp = sortArray[i];
                            sortArray[i] = sortArray[i + 1];
                            sortArray[i + 1] = temp;
                            swapped = true;
                        }
                    }
                } while (swapped);
            }
        }  
    

    控制台,使用排序:

            static void Main(string[] args)
            {
                //人按年龄排序
                People[] peoples = {new People("张三",43),
                                   new People("李四",12),
                                   new People("王五",50),
                                   new People("吴六",21),
                                   new People("陈七",33),};
                //Fun<>委托的写法
                BubbleSorter.Storter_Fun.Sort<People>(peoples, People.CompareAge);
                //匿名方法的写法
                BubbleSorter.Storter_Fun.Sort<People>(peoples, delegate(People p1, People p2)
                {
                    return p1.Age < p2.Age;
                });
                //Lambdah表达式的写法
                BubbleSorter.Storter_Fun.Sort<People>(peoples, (People p1, People p2) =>
                {
                    return p1.Age < p2.Age;
                });
                foreach (var people in peoples)
                {
                    Console.WriteLine(people);
                }
                //学生按分数排序
                Student[] students = {new Student("张三",80.5F),
                                   new Student("李四",85),
                                   new Student("王五",88),
                                   new Student("吴六",70),
                                   new Student("陈七",95),};
                BubbleSorter.Storter_Fun.Sort<Student>(students, Student.CompareScore);
                foreach (var student in students)
                {
                    Console.WriteLine(student);
                }
                Console.ReadKey();
            }  
    

    委托:调用方法的参数一般情况是数值型的,例如int,string,DataTable等等,能不能将方法本身作为一个参数传递给另一个方法呢?委托就是解决这个问题的。
    既然是参数,要就有类型。C#是强类型,方法的参数是int类型,就不能传string类型进去,否则在编辑阶段就报错了。
    int,string等是已有的类型,委托的类型就需要自定义。
    例如上面例子用到的:

    • Fun<T, T, bool> 代表方法是传入两个泛型参数,返回bool;
    • Fun<int,string,DataTable,Array> 代表方法是传入三个参数:int, string,DataTable,返回Array;
      就是最后一个参数为返回值类型;
      那么如果没有返回值呢?
    • Action<T,T> 代表方法是传入两个泛型参数,没返回值
    • Action<int,string> 代表方法是传入两个参数:int,string,没返回值
      定义了委托的类型,传入的方法必须要符合这个定义,即:传入参数,类型,个数,顺序,返回值要一致,否则编译不过,C#是强类型的原因。

    刚实现的冒泡可以支持不同对象的排序,主要是将冒泡比较大小方法传递进来(委托),与交换数据的临时变量使用了泛型实现;

  • 相关阅读:
    WinForm容器内控件批量效验是否同意为空?设置是否仅仅读?设置是否可用等方法分享
    EF的CRUD
    SICP 习题 (1.41)解题总结
    陈光标挽救纽约穷人背后有何玄机?
    poj 1276 Cash Machine(多重背包)
    vue的生命周期
    vue mounted组件的使用
    babel-polyfill的几种使用方式
    可拖拽排序的vue组件
    import、export 和 export default
  • 原文地址:https://www.cnblogs.com/xzwen/p/4461721.html
Copyright © 2020-2023  润新知