分享方式:


排序資料 (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}");
}

另請參閱