当然,这篇文章主要介绍怎么自定义C#中一个List的排序。而不是介绍什么delegate深奥的概念。
解决的问题主要是,student是一个含有int num,int class_num,string name三个类成员的类
假设有一个存放student类的数组,存着3个student元素,要按照int class_num与string name来排序如下图:
具体的代码如下:
using System; using System.Collections.Generic; class Student { public int num; public int class_num; public string name; public Student(int num, int class_num, string name) { this.num = num; this.class_num = class_num; this.name = name; } } class ClassListSort { /// <summary> /// 打乱学生动态数组student_list /// </summary> /// <param name="student_list">学生动态数组student_list</param> public static List<Student> shuffle_list(List<Student> list) { int currentIndex; Student temp; for (int i = 0; i < list.Count; i++) { currentIndex = new Random().Next(0, list.Count - i); temp = list[currentIndex]; list[currentIndex] = list[list.Count - 1 - i]; list[list.Count - 1 - i] = temp; } return list; } /// <summary> /// 打印学生动态数组student_list /// </summary> /// <param name="student_list">学生动态数组student_list</param> public static void print_student_list(List<Student> student_list) { Console.WriteLine("学号,班级,姓名"); foreach (Student student in student_list) { Console.WriteLine(student.num + "," + student.class_num + "," + student.name); } } public static void Main(string[] args) { List<Student> student_list = new List<Student>(); student_list.Add(new Student(1, 2, "aaav")); student_list.Add(new Student(2, 1, "ddde")); student_list.Add(new Student(3, 3, "cccs")); print_student_list(student_list); Console.WriteLine("打乱后的List为:"); student_list = shuffle_list(student_list); print_student_list(student_list); Console.WriteLine("按班级编号排序后的List为:"); student_list.Sort( delegate(Student student1, Student student2) { return student1.class_num < student2.class_num ? -1 : 1; }); print_student_list(student_list); Console.WriteLine("按姓名的首字母排序后的List为:"); student_list.Sort( delegate(Student student1, Student student2) { if (student1.name.CompareTo(student2.name) > 0) { return 1; } else { return -1; } }); print_student_list(student_list); } }
关键是对list带有的sort方法进行重写,原本一个存int的list直接调用sort()就会自动按int从小到大进行排序,然而对于一个存类的数组,就应该利用delegate自定义list的sort排序方法,这个delegate与《【Java】Collections中sort方法Comparator的重写》(点击打开链接)、《【JavaScript】利用sort()函数与文件碎片实现表格的前端排序,兼容IE6原生态》(点击打开链接)中的同样,两个变量是抽象的前者与后者,如果返回-1则定义前者少于后者,返回1则定义前者大于后者。
而C#中的注释///<summary>、/// <param name="student_list">能够在此算法以后的调用,如下图,实现中文的提示,没什么特别的意义。