Содержание
Продолжаем разбираться с LINQ в C# и сегодня рассмотрим работу с методами расширения для сортировки элементов в наборе данных.
Методы расширения OrderBy и OrderByDescending
Как можно понять из названия методов, OrderBy
сортирует выборку по возрастанию, а OrderByDescending
— по убыванию. Самая простая сортировка элементов в C# с использованием LINQ может выглядеть следующим образом:
int[] array = { -1, 5, 2, 7, 3, 9, 1, 0, 4 }; var result = array.OrderBy(t => t); foreach (int t in result) Console.Write($"{t} ");
На выходе получаем отсортированный в порядке возрастания массив:
Соответственно, этот же массив мы можем отсортировать и в обратном порядке — от большего к меньшему, используя метод OrderByDescending
:
int[] array = { -1, 5, 2, 7, 3, 9, 1, 0, 4 }; var result = array.OrderByDescending(t => t); foreach (int t in result) Console.Write($"{t} ");
Результат выполнения:
В качестве параметра методы OrderBy
и OrderByDescending
принимают делегат, определяющий порядок сортировки (в нашем случае — это само число из массива). При этом, мы можем сортировать не только обычные массивы, содержащие числа, но и любые коллекции элементов, например:
using System; using System.Linq; using System.Collections.Generic; namespace LinqSort { public class DataObject { public string Name { get; set; } public double Value { get; set; } public DateTime Date { get; set; } public override string ToString() { return $"{Name} {Value} {Date}"; } } class Program { static void Main(string[] args) { List<DataObject> objects = new List<DataObject>() { new DataObject {Name = "Измерение №1", Value = 12.5, Date = DateTime.Now }, new DataObject {Name = "Измерение №2", Value = 12.1, Date = DateTime.Now.AddDays(2) }, new DataObject {Name = "Измерение №3", Value = 80.5, Date = DateTime.Now.AddMonths(1) }, new DataObject {Name = "Измерение №4", Value = 11.3, Date = DateTime.Now.AddDays(7) }, new DataObject {Name = "Измерение №5", Value = 10.7, Date = DateTime.Now.AddHours(2.5) } }; //сортировка по полю Value в порядке возрастания var result = objects.OrderBy(t=>t.Value); foreach (DataObject data in result) { Console.WriteLine(data.ToString()); } Console.WriteLine(); //сортировка по полю Date в порядке убывания var result2 = objects.OrderByDescending(t => t.Date); foreach (DataObject data in result2) { Console.WriteLine(data.ToString()); } } } }
Здесь мы проводим сортировку элементов списка List<DataObject>
дважды: первый раз — в порядке возрастания значения поля Value
, а второй раз — в порядке убывания значения поля Date
. Аналогичным образом мы могли бы отсортировать список и по значениям поля Name
— LINQ позволяет проводить и сравнение строк.
Множественные критерии сортировки в LINQ (методы ThenBy и ThenByDescending)
При сортировке сложных объектов, например, как в предыдущем случае, бывает необходимо сортировать список не по одному, а сразу по нескольким полям. Используя методы расширения ThenBy
и ThenByDescending
мы можем это сделать. Например, отсортируем наш список из примера выше сначала по возрастанию поля Value, а, затем, по убыванию поля Date
.
static void Main(string[] args) { List<DataObject> objects = new List<DataObject>() { new DataObject {Name = "Измерение №1", Value = 12.5, Date = DateTime.Now }, new DataObject {Name = "Измерение №2", Value = 12.1, Date = DateTime.Now.AddDays(2) }, new DataObject {Name = "Измерение №3", Value = 80.5, Date = DateTime.Now.AddMonths(1) }, new DataObject {Name = "Измерение №4", Value = 11.3, Date = DateTime.Now.AddDays(7) }, new DataObject {Name = "Измерение №5", Value = 10.7, Date = DateTime.Now.AddHours(2.5) } }; var result = objects.OrderBy(t=>t.Value).ThenByDescending(v=>v.Date); foreach (DataObject data in result) { Console.WriteLine(data.ToString()); } }
Результат будет следующим:
Измерение №4 11,3 08.11.2021 12:39:11
Измерение №2 12,1 03.11.2021 12:39:11
Измерение №1 12,5 01.11.2021 12:39:11
Измерение №3 80,5 01.12.2021 12:39:11
Таким образом, с использованием методов ThenBy
и ThenByDescending
мы можем сортировать набор элементов по любому количеству полей и свойств объектов, находящихся в наборе.
Итого
Сегодня мы разобрали методы упорядочивания элементов в коллекциях. Используя методы OrderBy
и OrderByDescending
, а также ThenBy
и ThenByDescending
, мы можем проводить сортировку объектов любой сложности как по возрастанию, так и по убыванию.