排序是我们编程时的常用操作,实现方式也有很多种,本篇文章列举几种我常用的用法,希望对大家有用!
01
数组排序
最常见的排序是对一个数组排序,比如:
int[] aArray = new int[8] { 18, 17, 21, 23, 11, 31, 27, 38 };
第一种:我们最熟悉的冒泡排序法:即每个值都和它后面的数值比较,每次拿出最小值
static void Main(string[] args) { int[] aArray = new int[8] { 18, 17, 21, 23, 11, 31, 27, 38 }; for (int j = 0; j < aArray.Length - 1; j++) { for (int i = 0; i < aArray.Length - 1; i++) { if (aArray[i] > aArray[i + 1]) { int temp = aArray[i]; aArray[i] = aArray[i + 1]; aArray[i + 1] = temp; }
} }
foreach (var a in aArray) { Console.Write($"{a} "); } Console.ReadKey(); }
运行结果:
第二种:利用Array.Sort排序:
① 升序排列:
static void Main(string[] args) { int[] aArray = new int[8] { 18, 17, 21, 23, 11, 31, 27, 38 }; Array.Sort(aArray);
foreach (var a in aArray) { Console.Write($"{a} "); } Console.ReadKey(); }
运行结果:
② 降序排列:先升序排列,然后对数组反转
static void Main(string[] args) { int[] aArray = new int[8] { 18, 17, 21, 23, 11, 31, 27, 38 }; Array.Sort(aArray); Array.Reverse(aArray);
foreach (var a in aArray) { Console.Write($"{a} "); } Console.ReadKey(); }
运行结果:
02
List排序
大多数时候,我们需要将list集合里面的数据进行排序,
① 如果list直接放置的数值类型的数据就比较简单,比如:
List<int> aList = new List<int> { 18, 17, 21, 23, 11, 31, 27, 38 };
方法一:利用List<T> 自带的Sort排序方法
-. 升序排列:
aList.Sort();
降序排列:
aList.Sort(); aList.Reverse();
-. sort也可以用如下方式操作:
list.Sort((a, b) => a.CompareTo(b));//升序list.Sort((a, b) => b.CompareTo(a));//降序
方法二:利用List的OrderBy与OrderByDescending方法
升序排列:
List<int> aList = new List<int> { 18, 17, 21, 23, 11, 31, 27, 38 }; aList = aList.OrderBy(a => a).ToList();
降序排列:
List<int> aList = new List<int> { 18, 17, 21, 23, 11, 31, 27, 38 }; aList = aList.OrderByDescending(a => a).ToList();
方法三:利用link,这种感觉和方法二是一回事
List<int> aList = new List<int> { 18, 17, 21, 23, 11, 31, 27, 38 }; aList = (from a in aList orderby a ascending select a).ToList();//升序 aList = (from a in aList orderby a descending select a).ToList();//降序
②如果list存放的是一个类型,比如:
方法一: 一个集合存放学生的信息,按照学生的成绩升序排列:这里列举了2种方法,方法一注释了
static void Main(string[] args) { List<Student> stuList = new List<Student> { new Student() {name = "zyr", age = 23, score = 99}, new Student() {name = "zls", age = 25, score = 95}, new Student() {name = "zsq", age = 27, score = 100}, new Student() {name = "zlw", age = 15, score = 69}, new Student() {name = "ywe", age = 17, score = 72}, new Student() {name = "asw", age = 29, score = 58} };
//方法1 升序 //stuList.Sort((x, y) => x.score.CompareTo(y.score)); //方法2 升序 stuList = stuList.OrderBy(stu=>stu.score).ToList();
foreach (var stu in stuList) { Console.WriteLine($"{stu}"); } Console.ReadKey(); }
public class Student { public string name { get; set; } public int age { get; set; } public int score { get; set; }
public override string ToString() { return $"姓名是:{name},年龄是:{age},得分是:{score}"; } }
方法二: 加入这个学生成绩有重复的,对于重复的成绩按照年龄再排序:这里列举了2种方法,方法一注释了
static void Main(string[] args) { List<Student> stuList = new List<Student> { new Student() {name = "zyr", age = 23, score = 99}, new Student() {name = "zls", age = 25, score = 95}, new Student() {name = "zls", age = 22, score = 95}, new Student() {name = "zsq", age = 27, score = 100}, new Student() {name = "zlw", age = 15, score = 69}, new Student() {name = "ywe", age = 17, score = 72}, new Student() {name = "asw", age = 29, score = 58}, new Student() {name = "ywe", age = 18, score = 72}, new Student() {name = "zsq", age = 16, score = 100}, };
//方法1 升序 //stuList.Sort((x, y) => //{ // int ret = x.score.CompareTo(y.score); // if (ret == 0) // { // return x.age.CompareTo(y.age); // } // else // { // return ret; // } //}); //方法2 升序 //stuList = stuList.OrderBy(stu=>stu.score).ThenBy(stu => stu.age).ToList();
foreach (var stu in stuList) { Console.WriteLine($"{stu}"); } Console.ReadKey(); }
public class Student { public string name { get; set; } public int age { get; set; } public int score { get; set; }
public override string ToString() { return $"姓名是:{name},年龄是:{age},得分是:{score}"; } }