Sobes.tech
Назад к вопросам
Junior — Middle
56

Как извлечь список отделов и их средние значения зарплат из таблицы, содержащей поля для имени, отдела и заработной платы?

Компании, где спрашивали
Sector Tree

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Нужно показать, что данные можно сгруппировать по отделу и посчитать среднюю зарплату для каждой группы. В C# это обычно делают через LINQ: GroupBy + Average. В результате получают не список сотрудников, а агрегированный список по отделам.

Определение:

Для извлечения списка отделов и их средних зарплат из таблицы сначала данные группируют по полю отдела, а затем для каждой группы вычисляют среднее значение зарплаты. В C# это удобно делать через LINQ, потому что он позволяет выразить группировку и агрегацию в одном запросе.

Пример использования:

Допустим, есть список сотрудников с полями Name, Department и Salary. Нужно получить результат вида: Sales — 120000, IT — 150000.

using System;
using System.Collections.Generic;
using System.Linq;

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

public class Program
{
    public static void Main()
    {
        var employees = new List<Employee>
        {
            new Employee { Name = "Иван", Department = "IT", Salary = 120000 },
            new Employee { Name = "Анна", Department = "IT", Salary = 180000 },
            new Employee { Name = "Петр", Department = "Sales", Salary = 100000 },
            new Employee { Name = "Мария", Department = "Sales", Salary = 140000 }
        };

        var result = employees
            .GroupBy(e => e.Department)
            .Select(g => new
            {
                Department = g.Key,
                AverageSalary = g.Average(e => e.Salary)
            });

        foreach (var item in result)
        {
            Console.WriteLine($"{item.Department}: {item.AverageSalary}");
        }
    }
}

Пояснение кода:

Код не требует отдельной логики помимо LINQ, потому что задача решается через группировку и агрегацию.

  1. GroupBy(e => e.Department) — объединяет сотрудников по отделу.
  2. g.Key — это название текущего отдела.
  3. g.Average(e => e.Salary) — вычисляет среднюю зарплату внутри группы.
  4. Select(...) — преобразует группы в удобный для вывода анонимный объект.
  5. В foreach результат печатается построчно.

Ключевые моменты:

  • GroupBy используется, когда нужно собрать записи по общему признаку.
  • Average применяется к числовому полю внутри каждой группы.
  • Такой запрос можно выполнять как в памяти, так и над данными из ORM, если провайдер поддерживает перевод LINQ в SQL.
  • Если в отделе может не быть сотрудников, среднее по пустой группе нужно обрабатывать отдельно, иначе будет исключение.
  • Для зарплаты лучше использовать decimal, а не double, чтобы избежать ошибок округления.