Сортировка данных (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}");
}