Сортировка

  • Михаил
  • 12 мин. на прочтение
  • 123
  • 12 Dec 2010
  • 12 Dec 2010

Для сортировки набора данных по возрастанию используется оператор 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()сортирует по возрастанию. Для сортировки по убыванию используется метод :

1var 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() (для сортировки по убыванию):

var result = users.OrderBy(u => u.Name).ThenBy(u => u.Age).ThenBy(u=>u.Name.Length);

Результат будет аналогичен предыдущему.