Поделиться через


Сортировка данных (C#)

Операция сортировки упорядочивает элементы последовательности на основе одного или нескольких атрибутов. Первый критерий сортировки выполняет первичную сортировку элементов. Указав второй критерий поиска, можно сортировать элементы внутри каждой группы первичной сортировки.

Внимание

В этих примерах используется System.Collections.Generic.IEnumerable<T> источник данных. Источники данных, основанные на System.Linq.IQueryProvider использовании System.Linq.IQueryable<T> источников данных и деревьев выражений. Деревья выражений имеют ограничения на допустимый синтаксис C#. Кроме того, каждый IQueryProvider источник данных, например EF Core , может наложить больше ограничений. Ознакомьтесь с документацией по источнику данных.

На следующем рисунке показаны результаты операции сортировки в алфавитном порядке в последовательности символов:

Рисунок с операциями сортировки в алфавитном порядке.

Далее перечислены методы стандартных операторов запроса, которые выполняют сортировку данных.

Методы

Имя метода Description Синтаксис выражения запроса C# Дополнительные сведения
OrderBy Сортировка значений в возрастающем порядке. orderby Enumerable.OrderBy

Queryable.OrderBy
OrderByDescending Сортировка значений в убывающем порядке. orderby … descending Enumerable.OrderByDescending

Queryable.OrderByDescending
ThenBy Дополнительная сортировка по возрастанию. orderby …, … Enumerable.ThenBy

Queryable.ThenBy
ThenByDescending Дополнительная сортировка по убыванию. orderby …, … descending Enumerable.ThenByDescending

Queryable.ThenByDescending
Реверс Изменение порядка элементов в коллекции на обратный. Неприменимо. Enumerable.Reverse

Queryable.Reverse

Примечание.

В следующих примерах в этой статье используются общие источники данных для этой области.
Каждый из них Student имеет уровень оценки, основной отдел и ряд показателей. У него Teacher также есть свойство, определяющее City кампус, где учитель проводит классы. У Department него есть имя и ссылка на Teacher того, кто выступает в качестве руководителя отдела.
Пример набора данных можно найти в исходном репозитории.

public enum GradeLevel
{
    FirstYear = 1,
    SecondYear,
    ThirdYear,
    FourthYear
};

public class Student
{
    public required string FirstName { get; init; }
    public required string LastName { get; init; }
    public required int ID { get; init; }

    public required GradeLevel Year { get; init; }
    public required List<int> Scores { get; init; }

    public required int DepartmentID { get; init; }
}

public class Teacher
{
    public required string First { get; init; }
    public required string Last { get; init; }
    public required int ID { get; init; }
    public required string City { get; init; }
}

public class Department
{
    public required string Name { get; init; }
    public int ID { get; init; }

    public required int TeacherID { get; init; }
}

Основная сортировка по возрастанию

В следующем примере показано, как использовать orderby предложение в запросе LINQ для сортировки массива учителей по имени семьи в порядке возрастания.

IEnumerable<string> query = from teacher in teachers
                            orderby teacher.Last
                            select teacher.Last;

foreach (string str in query)
{
    Console.WriteLine(str);
}

Эквивалентный запрос, написанный с помощью синтаксиса метода, показан в следующем коде:

IEnumerable<string> query = teachers
    .OrderBy(teacher => teacher.Last)
    .Select(teacher => teacher.Last);

foreach (string str in query)
{
    Console.WriteLine(str);
}

Основная сортировка по убыванию

В следующем примере показано, как использовать orderby descending предложение в запросе LINQ для сортировки преподавателей по имени семьи в порядке убывания.

IEnumerable<string> query = from teacher in teachers
                            orderby teacher.Last descending
                            select teacher.Last;

foreach (string str in query)
{
    Console.WriteLine(str);
}

Эквивалентный запрос, написанный с помощью синтаксиса метода, показан в следующем коде:

IEnumerable<string> query = teachers
    .OrderByDescending(teacher => teacher.Last)
    .Select(teacher => teacher.Last);

foreach (string str in query)
{
    Console.WriteLine(str);
}

Дополнительная сортировка по возрастанию

В следующем примере показано, как использовать orderby предложение в запросе LINQ для выполнения первичной и вторичной сортировки. Учителя сортируются главным образом по городу и во второй раз по их имени семьи, как по возрастанию.

IEnumerable<(string, string)> query = from teacher in teachers
                            orderby teacher.City, teacher.Last
                            select (teacher.Last, teacher.City);

foreach ((string last, string city) in query)
{
    Console.WriteLine($"City: {city}, Last Name: {last}");
}

Эквивалентный запрос, написанный с помощью синтаксиса метода, показан в следующем коде:

IEnumerable<(string, string)> query = teachers
    .OrderBy(teacher => teacher.City)
    .ThenBy(teacher => teacher.Last)
    .Select(teacher => (teacher.Last, teacher.City));

foreach ((string last, string city) in query)
{
    Console.WriteLine($"City: {city}, Last Name: {last}");
}

Дополнительная сортировка по убыванию

В следующем примере показано использование предложения orderby descending в запросе LINQ для выполнения основной сортировки по возрастанию и дополнительной сортировки по убыванию. Учителя сортируются главным образом по городу и во второй раз по их имени семьи.

IEnumerable<(string, string)> query = from teacher in teachers
                            orderby teacher.City, teacher.Last descending
                            select (teacher.Last, teacher.City);

foreach ((string last, string city) in query)
{
    Console.WriteLine($"City: {city}, Last Name: {last}");
}

Эквивалентный запрос, написанный с помощью синтаксиса метода, показан в следующем коде:

IEnumerable<(string, string)> query = teachers
    .OrderBy(teacher => teacher.City)
    .ThenByDescending(teacher => teacher.Last)
    .Select(teacher => (teacher.Last, teacher.City));

foreach ((string last, string city) in query)
{
    Console.WriteLine($"City: {city}, Last Name: {last}");
}

См. также