排序資料 (C#)
排序作業會根據一個或多個屬性來排序序列的項目。 第一個排序準則會執行元素的主要排序; 您可以藉由指定第二個排序準則來排序每一個主要排序群組內的元素。
重要
這些範例會使用 System.Collections.Generic.IEnumerable<T> 資料來源。 根據 System.Linq.IQueryProvider 的資料來源會使用 System.Linq.IQueryable<T> 資料來源和運算式樹狀架構。 運算式樹狀架構在允許的 C# 語法方面有限制。 此外,每個 IQueryProvider
資料來源 (例如 EF Core) 可能會施加更多限制。 檢查資料來源的文件。
下圖顯示對一系列字元執行字母順序排序作業的結果:
下節列出可排序資料的標準查詢運算子方法。
方法
方法名稱 | 描述 | C# 查詢運算式語法 | 相關資訊 |
---|---|---|---|
OrderBy | 依遞增順序排序值。 | orderby |
Enumerable.OrderBy Queryable.OrderBy |
OrderByDescending | 依遞減順序排序值。 | orderby … descending |
Enumerable.OrderByDescending Queryable.OrderByDescending |
ThenBy | 依遞增順序執行次要排序。 | orderby …, … |
Enumerable.ThenBy Queryable.ThenBy |
ThenByDescending | 依遞減順序執行次要排序。 | orderby …, … descending |
Enumerable.ThenByDescending Queryable.ThenByDescending |
Reverse | 反轉集合中項目的順序。 | 不適用。 | Enumerable.Reverse Queryable.Reverse |
注意
本文中的下列範例會使用此區域的通用數據源。
每個 Student
都有一個等級、一個主要部門和一系列分數。 Teacher
也有一個 City
屬性,可識別教師持有課程的校園。 Department
具有名稱,以及擔任部門負責人 Teacher
的參考。
您可以在來源存放庫中找到範例數據集。
public enum GradeLevel
{
FirstYear = 1,
SecondYear,
ThirdYear,
FourthYear
};
public class Student
{
public required string FirstName { get; init; }
public required string LastName { get; init; }
public required int ID { get; init; }
public required GradeLevel Year { get; init; }
public required List<int> Scores { get; init; }
public required int DepartmentID { get; init; }
}
public class Teacher
{
public required string First { get; init; }
public required string Last { get; init; }
public required int ID { get; init; }
public required string City { get; init; }
}
public class Department
{
public required string Name { get; init; }
public int ID { get; init; }
public required int TeacherID { get; init; }
}
主要遞增排序
下列範例示範如何在 LINQ 查詢中使用 orderby
子句,以姓氏的遞增順序來排序教師的陣列。
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
使用方法語法撰寫的對等查詢會顯示在下列程式碼中:
IEnumerable<string> query = teachers
.OrderBy(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
主要遞減排序
下一個範例示範如何使用 orderby descending
LINQ 查詢中的 子句,以姓氏的遞減順序來排序教師。
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last descending
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
使用方法語法撰寫的對等查詢會顯示在下列程式碼中:
IEnumerable<string> query = teachers
.OrderByDescending(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
次要遞增排序
下列範例示範如何在 LINQ 查詢中使用 orderby
子句,以執行主要和次要排序。 教師主要按城市,其次按姓氏排序,兩者都是遞增順序。
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
使用方法語法撰寫的對等查詢會顯示在下列程式碼中:
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenBy(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
次要遞減排序
下一個範例示範如何在 LINQ 查詢中使用 orderby descending
子句,執行依遞增順序的主要排序以及依遞減順序的次要排序。 教師主要按城市,其次按姓氏排序。
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last descending
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
使用方法語法撰寫的對等查詢會顯示在下列程式碼中:
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenByDescending(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}