MST

星途 面试题库

面试题:C# LINQ 中的分组与聚合操作

假设有一个包含员工信息(姓名、部门、薪资)的列表,使用 LINQ 按部门对员工进行分组,并计算每个部门员工的平均薪资、最高薪资和最低薪资。请用代码实现,并解释分组和聚合操作在 LINQ 中的工作原理。
22.6万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

以下是使用C#语言实现该功能的代码:

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

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

class Program
{
    static void Main()
    {
        List<Employee> employees = new List<Employee>()
        {
            new Employee { Name = "Alice", Department = "HR", Salary = 5000m },
            new Employee { Name = "Bob", Department = "IT", Salary = 6000m },
            new Employee { Name = "Charlie", Department = "HR", Salary = 5500m },
            new Employee { Name = "David", Department = "IT", Salary = 6500m }
        };

        var result = employees
           .GroupBy(e => e.Department)
           .Select(group => new
            {
                Department = group.Key,
                AverageSalary = group.Average(e => e.Salary),
                MaxSalary = group.Max(e => e.Salary),
                MinSalary = group.Min(e => e.Salary)
            });

        foreach (var item in result)
        {
            Console.WriteLine($"Department: {item.Department}");
            Console.WriteLine($"Average Salary: {item.AverageSalary}");
            Console.WriteLine($"Max Salary: {item.MaxSalary}");
            Console.WriteLine($"Min Salary: {item.MinSalary}");
            Console.WriteLine();
        }
    }
}

LINQ中分组和聚合操作的工作原理

  1. 分组(GroupBy)

    • GroupBy操作根据指定的键选择器函数将序列中的元素进行分组。在上述代码中,employees.GroupBy(e => e.Department)根据员工的部门对员工进行分组。
    • 它返回一个IGrouping<TKey, TElement>类型的序列,其中TKey是分组依据的键类型(这里是string类型的部门名称),TElement是原始序列中的元素类型(这里是Employee类型)。
    • 每个IGrouping<TKey, TElement>对象包含一个Key属性,代表分组的键(即部门名称),以及属于该组的元素集合。
  2. 聚合(Aggregation)

    • 聚合操作对一组值进行计算并返回单个值。在上述代码中,我们在分组后的结果上使用了AverageMaxMin等聚合函数。
    • Average(e => e.Salary)计算每个分组中员工薪资的平均值。它遍历组内的每个员工,提取其薪资值,然后计算这些薪资值的平均值。
    • Max(e => e.Salary)找到每个分组中员工薪资的最大值。它遍历组内的每个员工,比较其薪资值,返回最大的薪资值。
    • Min(e => e.Salary)找到每个分组中员工薪资的最小值。它遍历组内的每个员工,比较其薪资值,返回最小的薪资值。
    • 这些聚合操作都是基于分组后的结果集进行计算的,所以每个组都会有各自的平均值、最大值和最小值。