Linq là một cách thức truy vấn dữ liệu từ một tập hợp dữ liệu. Đây là kiến thức cực kỳ quan trọng, là phần trọng tâm trong lập trình. Vậy thì Linq là gì và các toán tử sắp xếp của nó như thế nào? Cùng Comdy tìm hiểu chi tiết trong bài viết này nhé.
LINQ là gì?
-
Linq là một tính năng quan trọng trong ngôn ngữ lập trình C#
Linq c# là gì? Linq là tính năng trong ngôn ngữ lập trình C# (và cũng có thể sử dụng trong VB.NET và một số ngôn ngữ khác) được giới thiệu từ phiên bản .NET Framework 3.5.
Descending là gì?
Descending là thứ tự giảm dần. Khi bạn sắp xếp các phần tử theo thứ tự giảm dần, giá trị của chúng sẽ được sắp xếp từ lớn đến nhỏ. Chẳng hạn, nếu bạn sắp xếp một danh sách số nguyên theo thứ tự giảm dần, các số sẽ được sắp xếp từ số lớn nhất đến số nhỏ nhất.
Tổng quan về toán tử sắp xếp của LINQ
-
Tổng hợp các toán tử sắp xếp của LINQ C#
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 Orderbydescending trong LINQ
Orderby in linq 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 Orderby 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
-
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
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
-
Phương thức mở rộng orderby linq có hai phương thức quá tải
Khác với mệnh đề c# linq orderby trong cú pháp truy vấn, phương thức order by linq 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 linq 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 C# linq order by 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
Lưu ý: Trong cú pháp phương thức LINQ, phương thức OrderBy không hỗ trợ từ khóa descending để sắp xếp các phần tử trong danh sách theo thứ tự giảm dần. Sử dụng phương thức linq OrderByDescending để thực hiện điều này.
Toán tử sắp xếp OrderByDescending trong LINQ
Phương thức mở rộng OrderByDescending sắp xếp danh sách theo thứ tự giảm dần.
OrderByDescending chỉ hợp lệ với cú pháp phương thức. Nó không hợp lệ trong cú pháp truy vấn vì cú pháp truy vấn sử dụng toán tử orderbydescending linq và các từ khóa ascending / descending để sắp xếp tăng dần / giảm dần như được trình bày ở trên.
Ví dụ order by linq c# dưới đây sắp xếp danh sách giảm dần theo tê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 descending order var studentsInDescOrder = studentList.OrderByDescending(s => s.StudentName); foreach (var std in studentsInDescOrder) { Console.WriteLine(std.StudentName); }
Đây là kết quả khi biên dịch và thực thi chương trình:
Steve Ron Ram John Bill
Toán tử sắp xếp ThenBy trong LINQ

Nếu như phương thức mở rộng OrderBy được sử dụng để sắp xếp danh sách theo thứ tự tăng dần của trường đầu tiên thì phương thức ThenBy cho phép sắp xếp danh sách theo thứ tự tăng dần của trường tiếp theo nếu trường đầu tiên có giá trị giống nhau.
Phương thức mở rộng thenby c# chỉ hợp lệ với cú pháp phương thức LINQ.
Ví dụ dưới đây sắp xếp danh sách tăng dần theo tên và theo tuổi:
// 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 }, new Student() { StudentID = 6, StudentName = "Ron" , Age = 18 }, new Student() { StudentID = 7, StudentName = "Ram" , Age = 14 } }; var multiSortingResult = studentList.OrderBy(s => s.StudentName) .ThenBy(s => s.Age) .ToList(); foreach (var std in multiSortingResult) { Console.WriteLine($"Name: {std.StudentName}, Age {std.Age}"); }
Đây là kết quả khi biên dịch và thực thi chương trình:
Name: Bill, Age 25 Name: John, Age 18 Name: Ram, Age 14 Name: Ram, Age 20 Name: Ron, Age 18 Name: Ron, Age 19 Name: Steve, Age 15
Toán tử sắp xếp ThenByDescending trong LINQ
Tương tự phương thức mở rộng ThenBy, phương thức mở rộng ThenByDescending cũng được sử dụng để sắp xếp danh sách giảm dần theo trường tiếp theo nếu trường đầu tiên có giá trị giống nhau.
Phương thức mở rộng ThenByDescending chỉ hợp lệ với cú pháp phương thức LINQ.
Ví dụ dưới đây sắp xếp danh sách tăng dần theo tên và giảm dần theo tuổi:
// 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 }, new Student() { StudentID = 6, StudentName = "Ron" , Age = 18 }, new Student() { StudentID = 7, StudentName = "Ram" , Age = 14 } }; var multiSortingResult = studentList.OrderBy(s => s.StudentName) .ThenByDescending(s => s.Age) .ToList(); foreach (var std in multiSortingResult) { Console.WriteLine($"Name: {std.StudentName}, Age {std.Age}"); }
Đây là kết quả khi biên dịch và thực thi chương trình:
Name: Bill, Age 25 Name: John, Age 18 Name: Ram, Age 20 Name: Ram, Age 14 Name: Ron, Age 19 Name: Ron, Age 18 Name: Steve, Age 15
-
Phương thức mở rộng Reverse sắp xếp danh sách theo thứ tự ngược lại và nó chỉ hỗ trợ cú pháp phương thức LINQ.
Ví dụ dưới đây minh họa cách sử dụng toán tử sắp xếp Reverse trong cú pháp truy vấ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 } }; var multiSortingResult = studentList.Reverse().ToList(); foreach (var std in multiSortingResult) { Console.WriteLine($"Name: {std.StudentName}, Age {std.Age}"); }
Đây là kết quả khi biên dịch và thực thi chương trình:
Name: Ron, Age 19 Name: Ram, Age 20 Name: Bill, Age 25 Name: Steve, Age 15 Name: John, Age 18
Sắp xếp trên nhiều trường
Bạn có thể sắp xếp danh sách trên nhiều trường được phân tách bằng dấu phẩy.
Danh sách sẽ được sắp xếp dựa trên trường đầu tiên và sau đó nếu giá trị của trường thứ nhất giống nhau thì nó sẽ sử dụng trường thứ hai để sắp xếp, v.v.
Sử dụng cú pháp truy vấn LINQ
// 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 }, new Student() { StudentID = 6, StudentName = "Ron" , Age = 18 }, new Student() { StudentID = 7, StudentName = "Ram" , Age = 14 } }; var multiSortingResult = from s in studentList orderby s.StudentName, s.Age select s; var multiSortingMixResult = from s in studentList orderby s.StudentName ascending, s.Age descending select s; Console.WriteLine("Result 1:"); foreach (var std in multiSortingResult) { Console.WriteLine($"Name: {std.StudentName}, Age {std.Age}"); } Console.WriteLine("Result 2:"); foreach (var std in multiSortingMixResult) { Console.WriteLine($"Name: {std.StudentName}, Age {std.Age}"); }
Đây là kết quả khi biên dịch và thực thi chương trình:
Result 1: Name: Bill, Age 25 Name: John, Age 18 Name: Ram, Age 14 Name: Ram, Age 20 Name: Ron, Age 18 Name: Ron, Age 19 Name: Steve, Age 15 Result 2: Name: Bill, Age 25 Name: John, Age 18 Name: Ram, Age 20 Name: Ram, Age 14 Name: Ron, Age 19 Name: Ron, Age 18 Name: Steve, Age 15
Sử dụng cú pháp phương thức LINQ
Sắp xếp trên nhiều trường trong cú pháp phương thức khác với cú pháp truy vấn. Nó sử dụng các phương thức mở rộng OrderBy / OrderByDescending để sắp xếp danh sách theo trường đầu tiên và ThenBy / ThenByDescending để sắp xếp danh sách theo trường tiếp theo.
// 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 }, new Student() { StudentID = 6, StudentName = "Ron" , Age = 18 }, new Student() { StudentID = 7, StudentName = "Ram" , Age = 14 } }; var multiSortingResult = studentList.OrderBy(s => s.StudentName) .ThenBy(s => s.Age) .ToList(); var multiSortingMixResult = studentList.OrderBy(s => s.StudentName) .ThenByDescending(s => s.Age) .ToList(); Console.WriteLine("Result 1:"); foreach (var std in multiSortingResult) { Console.WriteLine($"Name: {std.StudentName}, Age {std.Age}"); } Console.WriteLine("Result 2:"); foreach (var std in multiSortingMixResult) { Console.WriteLine($"Name: {std.StudentName}, Age {std.Age}"); }
Đây là kết quả khi biên dịch và thực thi chương trình:
Result 1: Name: Bill, Age 25 Name: John, Age 18 Name: Ram, Age 14 Name: Ram, Age 20 Name: Ron, Age 18 Name: Ron, Age 19 Name: Steve, Age 15 Result 2: Name: Bill, Age 25 Name: John, Age 18 Name: Ram, Age 20 Name: Ram, Age 14 Name: Ron, Age 19 Name: Ron, Age 18 Name: Steve, Age 15
Những điểm cần nhớ về toán tử sắp xếp của LINQ
-
Những điểm quan trọng cần nhớ về toán tử sắp xếp của LINQ
- Cú pháp truy vấn này bao gồm năm toán tử sắp xếp: Order By c# linq , OrderByDescending, ThenBy, ThenByDescending và Reverse.
- Cú pháp truy vấn LINQ chỉ hỗ trợ mệnh đề linq c# orderby và có thể sắp xếp tăng dần hoặc giảm dần bằng cách sử dụng từ khóa ‘ascending’ và ‘descending’.
- Cú pháp truy vấn hỗ trợ sắp xếp theo nhiều trường được phân tách bằng dấu phẩy và từ khóa sắp xếp ‘ascending’ hoặc ‘descending’.
- Bạn phải sử dụng các phương thức orderby c# linq hoặc OrderByDescending kết hợp với linq thenby hoặc ThenByDescending để sắp xếp theo nhiều trường khác nhau khi sử dụng cú pháp phương thức LINQ.
- Sử dụng phương thức Reverse để sắp xếp đảo ngược danh sách sử dụng cú pháp phương thức LINQ.
Ascending order là gì?
Ascending là gì? Ascending order là thứ tự tăng dần. Khi bạn sắp xếp các phần tử theo thứ tự tăng dần, giá trị của chúng sẽ được sắp xếp từ nhỏ đến lớn. Chẳng hạn, nếu bạn sắp xếp một danh sách số nguyên theo thứ tự tăng dần, các số sẽ được sắp xếp từ số nhỏ nhất đến số lớn nhất.
Ví dụ:
Danh sách trước khi sắp xếp: 5, 2, 8, 1, 7
Danh sách sau khi sắp xếp tăng dần: 1, 2, 5, 7, 8
Kết lại
Trên đây là toàn bộ chia sẻ của Comdy.vn. Xin cám ơn vì đã theo dõi, ủng hộ bài viết.