LINQ Сортировка

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);
Результат будет аналогичен предыдущему.