1.對基礎類型進行排序
調用Sort()方法,如果需要降序
1 List<int> intList = new List<int>() { 1, 2, 3 }; 2 intList.Sort(); 3 foreach (int number in intList) 4 { 5 Console.WriteLine(number); 6 } 7 intList.Reverse(); 8 foreach (int number in intList) 9 { 10 Console.WriteLine(number); 11 } 12 Console.ReadKey();
2.對非基本類型進行排序,里面有兩個屬性,重寫了ToString方法
1 class Student 2 { 3 private int studentId; 4 private string studentName; 5 6 public int StudentId { get => studentId; set => studentId = value; } 7 public string StudentName { get => studentName; set => studentName = value; } 8 //重寫構造方法 9 public override string ToString() 10 { 11 return "studentId:" + studentId + " studentName:" + studentName; 12 } 13 }
然后添加一些數據,仍希望用Sort排序
1 List<Student> studentList = new List<Student>(); 2 Student objStu1 = new Student() { StudentId = 1, StudentName = "小王" }; 3 Student objStu2 = new Student() { StudentId = 2, StudentName = "小李" }; 4 Student objStu3 = new Student() { StudentId = 3, StudentName = "小范" }; 5 studentList.Add(objStu1); 6 studentList.Add(objStu2); 7 studentList.Add(objStu3); 8 studentList.Sort(); 9 foreach (Student objStu in studentList) 10 { 11 Console.WriteLine(objStu); 12 } 13 Console.ReadKey();
然后就出錯了,出錯信息如下:

查看Sort源碼可知它有如下幾個重載

3.實現IComparable接口(默認排序)

可以看到它只有一個方法,我們只需要修改類本身
1 class Student:IComparable<Student> 2 { 3 private int studentId; 4 private string studentName; 5 6 public int StudentId { get => studentId; set => studentId = value; } 7 public string StudentName { get => studentName; set => studentName = value; } 8 9 //實現接口 10 // 返回結果: 11 // 一個值,指示要比較的對象的相對順序。 返回值的含義如下: 12 // 值 含義 小於零 此實例在排序順序中位於 other 之前。 13 //零 此實例中出現的相同位置在排序順序中是 14 // other。 大於零 此實例在排序順序中位於 other 之后。 15 public int CompareTo(Student other) 16 { 17 return this.studentId.CompareTo(other.studentId); 18 } 19 20 //重寫構造方法 21 public override string ToString() 22 { 23 return "studentId:" + studentId + " studentName:" + studentName; 24 } 25 }
運行結果:

4.集合的動態排序
定義4個排序類,並且分別實現排序接口
1 class Student : IComparable<Student> 2 { 3 private int studentId; 4 private string studentName; 5 6 public int StudentId { get => studentId; set => studentId = value; } 7 public string StudentName { get => studentName; set => studentName = value; } 8 9 //實現接口 10 // 返回結果: 11 // 一個值,指示要比較的對象的相對順序。 返回值的含義如下: 值 含義 小於零 此實例在排序順序中位於 other 之前。 零 此實例中出現的相同位置在排序順序中是 12 // other。 大於零 此實例在排序順序中位於 other 之后。 13 public int CompareTo(Student other) 14 { 15 return this.studentId.CompareTo(other.studentId); 16 } 17 18 //重寫構造方法 19 public override string ToString() 20 { 21 return "studentId:" + studentId + " studentName:" + studentName; 22 } 23 } 24 //添加4個排序類,並且分別實現排序接口 25 class StuNameASC : IComparer<Student> 26 { 27 public int Compare(Student x, Student y) 28 { 29 return x.StudentName.CompareTo(y.StudentName); 30 } 31 } 32 class StuNameDESC : IComparer<Student> 33 { 34 public int Compare(Student x, Student y) 35 { 36 return y.StudentName.CompareTo(x.StudentName); 37 } 38 } 39 40 class StudentIdASC : IComparer<Student> 41 { 42 public int Compare(Student x, Student y) 43 { 44 return x.StudentId.CompareTo(y.StudentId); 45 } 46 } 47 class StudentIdDESC : IComparer<Student> 48 { 49 public int Compare(Student x, Student y) 50 { 51 return y.StudentId.CompareTo(x.StudentId); 52 } 53 }
1 在排序時使用Sort的重載方法 2 public void Sort(IComparer<T> comparer); 3 傳遞的是實現這個接口的類的對象 4 studentList.Sort(new StudentIdASC):表示的是按照學號升序排列
結果如下:

5.總結
泛型集合中基本數據類型可以直接排序,非基本數據類型要自定義排序方法