Ngôn ngữ LINQ - Toán tử OrderBy
Toán tử sắp xếp của LINQ
Một toán tử sắp xếp sẽ sắp xếp các phần tử của danh sách theo thứ tự tăng dần hoặc giảm dần. LINQ có các toán tử sắp xếp sau đây:
Toán tử | Mô tả |
---|---|
OrderBy | Sắp xếp các phần tử trong danh sách dựa trên trường được chỉ định. Trong đó toán tử orderby sắp xếp theo thứ tự tăng dần hoặc giảm dần còn phương thức mở rộng OrderBy sắp xếp theo thứ tự tăng dần. |
OrderByDescending | Sắp xếp các phần tử trong danh sách dựa trên trường được chỉ định theo thứ tự giảm dần. Chỉ có trong cú pháp phương thức, không có toán tử trong cú pháp truy vấn. |
ThenBy | Sắp xếp các phần tử trong danh sách dựa trên trường thứ hai theo thứ tự tăng dần. Chỉ có trong cú pháp phương thức, không có toán tử trong cú pháp truy vấn. |
ThenByDescending | Sắp xếp các phần tử trong danh sách dựa trên trường thứ hai theo thứ tự giảm dần. Chỉ có trong cú pháp phương thức, không có toán tử trong cú pháp truy vấn. |
Reverse | Sắp xếp các phần tử trong danh sách theo thứ tự ngược lại. Chỉ có trong cú pháp phương thức, không có toán tử trong cú pháp truy vấn. |
Toán tử sắp xếp là một trong những toán tử truy vấn chuẩn của LINQ.
Toán tử sắp xếp OrderBy trong LINQ
OrderBy sắp xếp các giá trị của một danh sách theo thứ tự tăng dần hoặc giảm dần. LINQ hỗ trợ OderBy cả trong cú pháp truy vấn và cú pháp phương thức.
Mệnh đề orderby trong cú pháp truy vấn LINQ
Toán tử orderby
trong cú pháp truy vấn LINQ sắp xếp danh sách theo thứ tự tăng dần theo mặc định vì từ khóa ascending
là tùy chọn ở đây. Sử dụng từ khóa descending
để sắp xếp danh sách theo thứ tự giảm dần.
// Student collection
IList<Student> studentList = new List<Student>()
{
new Student() { StudentID = 1, StudentName = "John", Age = 18 },
new Student() { StudentID = 2, StudentName = "Steve", Age = 15 },
new Student() { StudentID = 3, StudentName = "Bill", Age = 25 },
new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 },
new Student() { StudentID = 5, StudentName = "Ron" , Age = 19 }
};
// Sorts the studentList collection in ascending order
var orderByResult = from s in studentList
orderby s.StudentName
select s;
//Sorts the studentList collection in descending order
var orderByDescendingResult = from s in studentList
orderby s.StudentName descending
select s;
Console.WriteLine("Ascending Order:");
foreach (var std in orderByResult)
{
Console.WriteLine(std.StudentName);
}
Console.WriteLine("Descending Order:");
foreach (var std in orderByDescendingResult)
{
Console.WriteLine(std.StudentName);
}
Đây là kết quả khi biên dịch và thực thi chương trình:
Ascending Order:
Bill
John
Ram
Ron
Steve
Descending Order:
Steve
Ron
Ram
John
Bill
Phương thức OrderBy trong cú pháp phương thức LINQ
Khác với mệnh đề orderby
trong cú pháp truy vấn, phương thức OrderBy
chỉ có thể sắp xếp các phần tử trong danh sách theo thứ tự tăng dần.
Phương thức mở rộng OrderBy có hai phương thức quá tải. Phương thức quá tải đầu tiên của OrderBy chấp nhận tham số kiểu delegate Func. Vì vậy, bạn cần truyền biểu thức lambda cho trường mà bạn muốn sắp xếp danh sách.
Phương thức quá tải thứ hai của OrderBy chấp nhận đối tượng của IComparer cùng với kiểu delegate Func, sử dụng so sánh tùy chỉnh để sắp xếp.
public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector);
public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
IComparer<TKey> comparer);
Ví dụ sau đây sắp xếp danh sách studentList theo thứ tự tăng dần của StudentName bằng phương thức mở rộng OrderBy.
// Student collection
IList<Student> studentList = new List<Student>()
{
new Student() { StudentID = 1, StudentName = "John", Age = 18 },
new Student() { StudentID = 2, StudentName = "Steve", Age = 15 },
new Student() { StudentID = 3, StudentName = "Bill", Age = 25 },
new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 },
new Student() { StudentID = 5, StudentName = "Ron" , Age = 19 }
};
// Sorts the studentList collection in ascending order
var studentsInAscOrder = studentList.OrderBy(s => s.StudentName);
foreach (var std in studentsInAscOrder)
{
Console.WriteLine(std.StudentName);
}
Đây là kết quả khi biên dịch và thực thi chương trình:
Bill
John
Ram
Ron
Steve