C# LINQ 排序介紹 (OrderBy, ThenBy)

在 LINQ 中的排序會使用 OrderBy 和 OrderByDescending ,來將集合做遞增排序和遞減排序。不過這兩個只能使用一個條件排序,如果需要增加次要排序條件則要使用 ThenBy 和 ThenByDescending 方法,來增加次要條件達成遞增和遞減。

下面就來示範這四個方法的使用方式

建立測試物件:
    
/// <summary>
/// 測驗成績
/// </summary>
/// <param name="No">學號</param>
/// <param name="Score">成績</param>
public record TestScore(string No, int Score);
    

建立測試資料:
    
// 測驗成績清單
TestScore[] testScores =
{
    new("001", 70),
    new("002", 80),
    new("003", 90),
    new("004", 80),
    new("005", 70),
    new("006", 60),
};
    

遞增排序 OrderBy

使用學號遞增排序
    
List<TestScore> list = testScores
    .OrderBy(x => x.No)
    .ToList();
    

輸出結果:
    
list.ForEach(item => Console.WriteLine($"No:{item.No}, Score:{item.Score}"));

/*
No:001, Score:70
No:002, Score:80
No:003, Score:90
No:004, Score:80
No:005, Score:70
No:006, Score:60
*/
    

遞減排序

成績遞減排序
    
List<TestScore> list = testScores
    .OrderByDescending(x => x.Score)
    .ToList();
    

輸出結果:
    
list.ForEach(item => Console.WriteLine($"No:{item.No}, Score:{item.Score}"));

/*
No:003, Score:90
No:002, Score:80
No:004, Score:80
No:001, Score:70
No:005, Score:70
No:006, Score:60
*/
    

加入排序次要條件

第二條件遞增排序 ThenBy

使用成績遞減排序,相同成績再使用學號遞增排序:
    
List<TestScore> list = testScores
    .OrderByDescending(x => x.Score)
    .ThenBy(x => x.No)
    .ToList();
    

輸出結果:
    
list.ForEach(item => Console.WriteLine($"No:{item.No}, Score:{item.Score}"));

/*
No:003, Score:90
No:002, Score:80
No:004, Score:80
No:001, Score:70
No:005, Score:70
No:006, Score:60
*/
    

第二條件遞減排序 ThenByDescending

使用成績遞減排序,相同成績再使用學號遞減排序:
    
List<TestScore> list = testScores
    .OrderByDescending(x => x.Score)
    .ThenByDescending(x => x.No)
    .ToList();
    

輸出結果:
    
list.ForEach(item => Console.WriteLine($"No:{item.No}, Score:{item.Score}"));

/*
No:003, Score:90
No:004, Score:80
No:002, Score:80
No:005, Score:70
No:001, Score:70
No:006, Score:60
*/
    



延伸閱讀: C# LINQ 從 0 到 1 基礎教學

參考資料:
Microsoft.Learn - Enumerable.OrderBy Method
Microsoft.Learn - Enumerable.OrderByDescending Method
Microsoft.Learn - Enumerable.ThenBy Method
Microsoft.Learn - Enumerable.ThenByDescending Method

留言