Sort
Sort 是 List<T> 自带的排序方法,其排序特性如下:
1、默认升序;
2、会改变原列表;
3、不稳定排序:相等元素的相对次序可能会改变。
基本数据类型
方法一
List<int> intList = new List<int> {4, 5, 1, 3, 2};
// 升序
intList.Sort(); // 1 2 3 4 5
/*
// 降序(先升序,再反转)
intList.Sort();
intList.Reverse(); // 5 4 3 2 1
*/
方法二
List<int> intList = new List<int> {4, 5, 1, 3, 2};
// 升序
/*intList.Sort((x, y) => x.CompareTo(y)); // 1 2 3 4 5
/*
// 降序
intList.Sort((x, y) => y.CompareTo(x)); // 5 4 3 2 1
*/
自定义数据类型
自定义 Student 类
public class Student
{
public string name {get; set;}
public int age {get; set;}
public int score {get; set;}
}
单属性排序
void dumpList(List<Student> stuList, string desc)
{
Console.WriteLine(desc);
foreach(var student in stuList)
{
Console.Write("name = {0}, age = {1}, score = {2}", student.name, student.age, student.score);
Console.WriteLine();
}
}
List<Student> stuList = new List<Student> {
new Student() {name = "张三", age = 20, score = 95},
new Student() {name = "李四", age = 19, score = 99},
new Student() {name = "王五", age = 21, score = 95},
new Student() {name = "赵六", age = 20, score = 90},
new Student() {name = "陈七", age = 22, score = 95},
new Student() {name = "刘八", age = 21, score = 92}
};
dumpList(stuList, "-----原始列表-----");
// -----原始列表-----
// name = 张三, age = 20, score = 95
// name = 李四, age = 19, score = 99
// name = 王五, age = 21, score = 95
// name = 赵六, age = 20, score = 90
// name = 陈七, age = 22, score = 95
// name = 刘八, age = 21, score = 92
stuList.Sort((x, y) => x.score.CompareTo(y.score));
dumpList(stuList, "-----按 score 属性升序-----");
// -----按 score 属性升序-----
// name = 赵六, age = 20, score = 90
// name = 刘八, age = 21, score = 92
// name = 张三, age = 20, score = 95
// name = 陈七, age = 22, score = 95
// name = 王五, age = 21, score = 95
// name = 李四, age = 19, score = 99
stuList.Sort((x, y) => y.age.CompareTo(x.age));
dumpList(stuList, "-----按 age 属性降序-----");
// -----按 age 属性降序-----
// name = 陈七, age = 22, score = 95
// name = 王五, age = 21, score = 95
// name = 刘八, age = 21, score = 92
// name = 赵六, age = 20, score = 90
// name = 张三, age = 20, score = 95
// name = 李四, age = 19, score = 99
嵌套排序
List<Student> stuList = new List<Student> {
new Student() {name = "张三", age = 20, score = 95},
new Student() {name = "李四", age = 19, score = 99},
new Student() {name = "王五", age = 21, score = 95},
new Student() {name = "赵六", age = 20, score = 90},
new Student() {name = "陈七", age = 22, score = 95},
new Student() {name = "刘八", age = 21, score = 92}
};
dumpList(stuList, "-----原始列表-----");
// -----原始列表-----
// name = 张三, age = 20, score = 95
// name = 李四, age = 19, score = 99
// name = 王五, age = 21, score = 95
// name = 赵六, age = 20, score = 90
// name = 陈七, age = 22, score = 95
// name = 刘八, age = 21, score = 92
stuList.Sort((x, y) => {
int ret = y.score.CompareTo(x.score);
if (ret == 0)
{
return x.age.CompareTo(y.age);
}
else
{
return ret;
}
});
dumpList(stuList, "-----嵌套排序:按 score 降序,score 相同则按 age 升序-----");
// -----嵌套排序:按 score 降序,score 相同则按 age 升序-----
// name = 李四, age = 19, score = 99
// name = 张三, age = 20, score = 95
// name = 王五, age = 21, score = 95
// name = 陈七, age = 22, score = 95
// name = 刘八, age = 21, score = 92
// name = 赵六, age = 20, score = 90
ps
obj1.CompareTo(obj2) 返回值(int):
- 大于0(1):obj1 在 obj2 后面;
- 等于0(0):obj1 和 obj2 在同一位置;
- 小于0(-1):obj1 在 obj2 前面;
OrderBy/OrderByDescending
OrderBy/OrderByDescending (OrderBy升序,OrderByDescending降序)是通用的序列排序方法,其排序特性如下:
1、使用前必须先引入命名空间:System.Linq;
2、不会改变原列表;
3、稳定排序:相等元素的相对次序不会改变。
基本数据类型
List<int> intList = new List<int> {4, 5, 1, 3, 2};
// 升序
intList = intList.OrderBy(x => x).ToList(); // 1 2 3 4 5
// 降序
intList = intList.OrderByDescending(x => x).ToList(); // 5 4 3 2 1
自定义数据类型
单属性排序
List<Student> stuList = new List<Student> {
new Student() {name = "张三", age = 20, score = 95},
new Student() {name = "李四", age = 19, score = 99},
new Student() {name = "王五", age = 21, score = 95},
new Student() {name = "赵六", age = 20, score = 90},
new Student() {name = "陈七", age = 22, score = 95},
new Student() {name = "刘八", age = 21, score = 92}
};
dumpList(stuList, "-----原始列表-----");
// -----原始列表-----
// name = 张三, age = 20, score = 95
// name = 李四, age = 19, score = 99
// name = 王五, age = 21, score = 95
// name = 赵六, age = 20, score = 90
// name = 陈七, age = 22, score = 95
// name = 刘八, age = 21, score = 92
stuList = stuList.OrderBy(obj => obj.score).ToList();
dumpList(stuList, "-----按 score 属性升序-----");
// -----按 score 属性升序-----
// name = 赵六, age = 20, score = 90
// name = 刘八, age = 21, score = 92
// name = 张三, age = 20, score = 95
// name = 王五, age = 21, score = 95
// name = 陈七, age = 22, score = 95
// name = 李四, age = 19, score = 99
stuList = stuList.OrderByDescending(obj => obj.age).ToList();
dumpList(stuList, "-----按 age 属性降序-----");
// -----按 age 属性降序-----
// name = 陈七, age = 22, score = 95
// name = 刘八, age = 21, score = 92
// name = 王五, age = 21, score = 95
// name = 赵六, age = 20, score = 90
// name = 张三, age = 20, score = 95
// name = 李四, age = 19, score = 99
嵌套排序
List<Student> stuList = new List<Student> {
new Student() {name = "张三", age = 20, score = 95},
new Student() {name = "李四", age = 19, score = 99},
new Student() {name = "王五", age = 21, score = 95},
new Student() {name = "赵六", age = 20, score = 90},
new Student() {name = "陈七", age = 22, score = 95},
new Student() {name = "刘八", age = 21, score = 92}
};
dumpList(stuList, "-----原始列表-----");
// -----原始列表-----
// name = 张三, age = 20, score = 95
// name = 李四, age = 19, score = 99
// name = 王五, age = 21, score = 95
// name = 赵六, age = 20, score = 90
// name = 陈七, age = 22, score = 95
// name = 刘八, age = 21, score = 92
stuList = stuList.OrderByDescending(obj => obj.score).ThenBy(obj => obj.age).ToList();
dumpList(stuList, "-----嵌套排序:按 score 降序,score 相同则按 age 升序-----");
// -----嵌套排序:按 score 降序,score 相同则按 age 升序-----
// name = 李四, age = 19, score = 99
// name = 张三, age = 20, score = 95
// name = 王五, age = 21, score = 95
// name = 陈七, age = 22, score = 95
// name = 刘八, age = 21, score = 92
// name = 赵六, age = 20, score = 90
stuList = stuList.OrderBy(obj => obj.score).ThenByDescending(obj => obj.age).ToList();
dumpList(stuList, "-----嵌套排序:按 score 升序,score 相同则按 age 降序-----");
// -----嵌套排序:按 score 升序,score 相同则按 age 降序-----
// name = 赵六, age = 20, score = 90
// name = 刘八, age = 21, score = 92
// name = 陈七, age = 22, score = 95
// name = 王五, age = 21, score = 95
// name = 张三, age = 20, score = 95
// name = 李四, age = 19, score = 99
ps
OrderBy/OrderByDescending 返回序列的类型为 IOrderedEnumerable<TSource>,可以用 ToList 将其转为列表!
即:
stuList = stuList.OrderBy(obj => obj.score).ToList();
=>
IOrderedEnumerable<Student> query = stuList.OrderBy(obj => obj.score);
stuList = query.ToList();
参考: