Что такое ThenBy в LINQ?

«Что такое ThenBy в LINQ?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ThenBy — это метод расширения LINQ, который применяется для последующей сортировки по дополнительному ключу после первичной сортировки, выполненной методами OrderBy или OrderByDescending. Он возвращает интерфейс IOrderedEnumerable<T>.

Синтаксис и пример:

class Employee
{
    public string Department { get; set; }
    public string Name { get; set; }
    public int Salary { get; set; }
}

var employees = new List<Employee>
{
    new Employee { Department = "IT", Name = "Charlie", Salary = 60000 },
    new Employee { Department = "HR", Name = "Alice", Salary = 55000 },
    new Employee { Department = "IT", Name = "Bob", Salary = 70000 },
    new Employee { Department = "IT", Name = "Alice", Salary = 65000 }
};

// Сортировка по отделу (по возрастанию), затем по имени (по возрастанию),
// затем по зарплате (по убыванию)
var sortedEmployees = employees
    .OrderBy(e => e.Department)          // Первичный ключ
    .ThenBy(e => e.Name)                 // Вторичный ключ
    .ThenByDescending(e => e.Salary);    // Третичный ключ (по убыванию)

/* Результат:
   Department: HR,  Name: Alice, Salary: 55000
   Department: IT,  Name: Alice, Salary: 65000
   Department: IT,  Name: Bob,   Salary: 70000
   Department: IT,  Name: Charlie, Salary: 60000
*/

Ключевые особенности:

  • Работает только после OrderBy: Вызов ThenBy без предшествующего OrderBy/OrderByDescending вызовет ошибку компиляции.
  • Ленивое выполнение: Сортировка происходит только в момент перечисления результатов (например, в цикле foreach или при вызове ToList()).
  • Стабильность: Методы сортировки LINQ являются стабильными. Это означает, что если два элемента имеют одинаковые ключи, их относительный порядок из исходной коллекции сохраняется.
  • Аналог для SQL: Соответствует конструкции ORDER BY Department, Name, Salary DESC в SQL.

ThenBy и ThenByDescending — незаменимые инструменты для реализации многоуровневой сортировки данных в запросах LINQ.