LINQ в C#: сортировка элементов

Продолжаем разбираться с 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} ");

На выходе получаем отсортированный в порядке возрастания массив:

-1 0 1 2 3 4 5 7 9

Соответственно, этот же массив мы можем отсортировать и в обратном порядке — от большего к меньшему, используя метод 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} ");

Результат выполнения:

9 7 5 4 3 2 1 0 -1

В качестве параметра методы 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. Аналогичным образом мы могли бы отсортировать список и по значениям поля NameLINQ позволяет проводить и сравнение строк.

Множественные критерии сортировки в 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());
    }
}

Результат будет следующим:

Измерение №5 10,7 01.11.2021 15:09:11
Измерение №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 , мы можем проводить сортировку объектов любой сложности как по возрастанию, так и по убыванию.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии