C Sharp > LINQ Сортировка
02.12.2016 12:01:28
Наиболее часто встречающиеся слова в статье:
[orderby] [сортировки] [возрастанию] [OrderBy] [numbers] [foreach] [Console] [WriteLine] [убыванию]
Статья:
Для сортировки набора данных по возрастанию используется оператор orderby: int[] numbers = { 3, 12, 4, 10, 34, 20, 55, -66, 77, 88, 4 }; var orderedNumbers = from i in numbers orderby i select i; foreach (int i in orderedNumbers) Console.WriteLine(i); Оператор orderby принимает критерий сортировки. В данном случае в качестве критерия выступает само число. Возьмем посложнее пример. Допустим, надо отсортировать выборку сложных объектов. Тогда в качестве критерия мы можем указать свойство класса объекта: List<User> users = new List<User>() { new User { Name = "Tom", Age = 33 }, new User { Name = "Bob", Age = 30 }, new User { Name = "Tom", Age = 21 }, new User { Name = "Sam", Age = 43 } }; var sortedUsers = from u in users orderby u.Name select u; foreach (User u in sortedUsers) Console.WriteLine(u.Name); По умолчанию оператор orderby производит сортировку по возрастанию. Однако с помощью ключевых слов ascending (сортировка по возрастанию) и descending (сортировка по убыванию) можно явным образом указать направление сортировки: var sortedUsers = from u in users orderby u.Name descending select u; Вместо оператора orderby можно использовать методы расширения OrderBy: int[] numbers = { 3, 12, 4, 10, 34, 20, 55, -66, 77, 88, 4 }; IEnumerable<int> sortedNumbers = numbers.OrderBy(i=>i); List<User> users = new List<User>() { new User { Name = "Tom", Age = 33 }, new User { Name = "Bob", Age = 30 }, new User { Name = "Tom", Age = 21 }, new User { Name = "Sam", Age = 43 } }; var sortedUsers = users.OrderBy(u=>u.Name); Метод OrderBy()сортирует по возрастанию. Для сортировки по убыванию используется метод : 1 var sortedUsers = users.OrderByDescending(u=>u.Name); Множественные критерии сортировки В наборах сложных объектов иногда встает ситуация, когда надо отсортировать не по одному, а сразу по нескольким полям. Для этого в запросе LINQ все критерии указываются в порядке приоритета через запятую: List<User> users = new List<User>() { new User { Name = "Tom", Age = 33 }, new User { Name = "Bob", Age = 30 }, new User { Name = "Tom", Age = 21 }, new User { Name = "Sam", Age = 43 } }; var result = from user in users orderby user.Name, user.Age, user.Name.Length select user; foreach (User u in result) Console.WriteLine("{0} - {1}", u.Name, u.Age); Результат программы: Alice - 28 Bob - 30 Sam - 43 Tom - 21 Tom - 33 С помощью методов расширения то же самое можно сделать через метод ThenBy()(для сортировки по возрастанию) и ThenByDescending() (для сортировки по убыванию): 1 var result = users.OrderBy(u => u.Name).ThenBy(u => u.Age).ThenBy(u=>u.Name.Length); Результат будет аналогичен предыдущему.