面试题答案
一键面试以下是使用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中分组和聚合操作的工作原理
-
分组(GroupBy):
GroupBy
操作根据指定的键选择器函数将序列中的元素进行分组。在上述代码中,employees.GroupBy(e => e.Department)
根据员工的部门对员工进行分组。- 它返回一个
IGrouping<TKey, TElement>
类型的序列,其中TKey
是分组依据的键类型(这里是string
类型的部门名称),TElement
是原始序列中的元素类型(这里是Employee
类型)。 - 每个
IGrouping<TKey, TElement>
对象包含一个Key
属性,代表分组的键(即部门名称),以及属于该组的元素集合。
-
聚合(Aggregation):
- 聚合操作对一组值进行计算并返回单个值。在上述代码中,我们在分组后的结果上使用了
Average
、Max
和Min
等聚合函数。 Average(e => e.Salary)
计算每个分组中员工薪资的平均值。它遍历组内的每个员工,提取其薪资值,然后计算这些薪资值的平均值。Max(e => e.Salary)
找到每个分组中员工薪资的最大值。它遍历组内的每个员工,比较其薪资值,返回最大的薪资值。Min(e => e.Salary)
找到每个分组中员工薪资的最小值。它遍历组内的每个员工,比较其薪资值,返回最小的薪资值。- 这些聚合操作都是基于分组后的结果集进行计算的,所以每个组都会有各自的平均值、最大值和最小值。
- 聚合操作对一组值进行计算并返回单个值。在上述代码中,我们在分组后的结果上使用了