Содержание
Продолжаем разбираться с 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 , мы можем проводить сортировку объектов любой сложности как по возрастанию, так и по убыванию.