عملگرهای مرتبسازی OrderBy و OrderByDescending
مرتبسازی به فرآیندی گفته می شود که در آن عناصر موجود در مجموعه به صورت صعودی یا نزولی قرار می گیرند. در جدول زیر می توانید عملگرهای مرتبسازی موجود در LINQ را مشاهده کنید.
عملگر | توضیحات |
OrderBy | عناصر موجود در یک مجموعه را بر اساس فیلد مشخص شده به صورت صعودی مرتب می کند. |
OrderByDescending | عناصر موجود در یک مجموعه را بر اساس فیلد مشخص شده به صورت نزولی مرتب می کند. فقط در سینتکس متد معتبر است. |
ThenBy | فقط در سینتکس متد معتبر است. برای مشخص کردن لول های بعدی مرتبسازی به صورت صعودی استفاده می شود. |
ThenByDescending | فقط در سینتکس متد معتبر است. برای مشخص کردن لول های بعدی مرتبسازی به صورت نزولی استفاده می شود. |
Reverse | فقط در سینتکس متد معتبر است. برای برعکس کردن ترتیب عناصر مجموعه استفاده می شود. |
عملگر OrderBy در سینتکس کوئری
OrderBy عناصر یک مجموعه را به صورت صعودی مرتب می کند. برای نمونه در مثال زیر لیست دانش آموزان بر اساس نام و به صورت صعودی مرتب می شود:
1 2 3 4 5 6 7 8 9 10 | 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 orderByResult = from s in studentList orderby s.StudentName select s; |
نتیجه تولید شده توسط کوئری فوق به این صورت خواهد بود:
1 2 3 4 5 | Bill John Ram Ron Steve |
به منظور مرتبسازی به شکل نزولی می توانید مانند نمونه زیر از عملگر descending استفاده کنید:
1 2 3 | var orderByDescendingResult = from s in studentList orderby s.StudentName descending select s; |
عملگر OrderBy در سینتکس متد
در سینتکس متد این عملگر دو overload دارد که اولی یک delegate به عنوان ورودی می گیرد. بنابراین باید یک عبارت لامبدا برای مشخص کردن فیلد مورد نظر برای مرتبسازی بر اساس آن به متد ارسال کنید. overload دوم یک ورودی دیگر از نوع IComparer دارد که این امکان را به ما می دهد تا منطق خودمان را برای مقایسه عناصر استفاده کنیم.
1 2 3 4 5 | 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); |
در مثال زیر لیست دانش آموزان بر اساس نام و به صورت صعودی مرتب می شود:
1 2 3 4 5 6 7 8 | 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 studentsInAscOrder = studentList.OrderBy(s => s.StudentName); |
برای مرتبسازی به شکل نزولی می توانید مانند نمونه زیر از متد OrderByDescending استفاده کنید:
1 | var studentsInDescOrder = studentList.OrderByDescending(s => s.StudentName); |
مرتبسازی چندگانه
مرتبسازی چندگانه زمانی استفاده می شود که بخواهیم مجموعه مورد نظر را بر اساس بیش از یک فیلد مرتب کنیم. در این حالت ابتدا مجموعه بر اساس فیلد اول مرتب می شود و اگر عناصری بر اساس فیلد اول مقدار مشابه داشته باشند، بر اساس فیلد دوم مرتب می شوند.
1 2 3 4 5 6 7 8 9 10 11 | 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 = "Ram" , Age = 18 } }; var orderByResult = from s in studentList orderby s.StudentName, s.Age select new { s.StudentName, s.Age }; |
در مثال فوق مجموعه دانش آموزان دو مورد با نام یکسان دارد (Ram). بنابراین مجموعه ابتدا بر اساس نام دانش آموزان مرتب شده و سپس بر اساس سن مرتب می شود. نتیجه به این صورت خواهد بود:
1 2 3 4 5 6 | StudentName: Bill, Age: 25 StudentName: John, Age: 18 StudentName: Ram, Age: 18 StudentName: Ram, Age: 20 StudentName: Ron, Age: 19 StudentName: Steve, Age: 15 |
هیچ نظری ثبت نشده است