跳到主要内容

C# LINQ 分组

在 C# 中,LINQ(Language Integrated Query)是一种强大的工具,用于查询和操作数据。其中,分组是 LINQ 中一个非常重要的操作,它允许我们根据某个条件将数据分成多个组。本文将详细介绍如何使用 LINQ 进行分组操作,并通过示例代码和实际案例帮助你理解其应用。

什么是 LINQ 分组?

LINQ 分组操作允许我们根据指定的键(Key)将数据集合中的元素分组。每个组包含具有相同键值的元素。分组操作的结果是一个 IGrouping<TKey, TElement> 对象的集合,其中 TKey 是分组的键,TElement 是组中的元素。

基本语法

LINQ 分组操作通常使用 GroupBy 方法。其基本语法如下:

csharp
var groupedData = collection.GroupBy(item => item.Key);
  • collection:要分组的集合。
  • item => item.Key:指定用于分组的键。

示例:按属性分组

假设我们有一个 Student 类,其中包含学生的姓名和年龄信息。我们希望根据学生的年龄将他们分组。

csharp
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
}

var students = new List<Student>
{
new Student { Name = "Alice", Age = 20 },
new Student { Name = "Bob", Age = 21 },
new Student { Name = "Charlie", Age = 20 },
new Student { Name = "David", Age = 22 },
new Student { Name = "Eve", Age = 21 }
};

var groupedStudents = students.GroupBy(student => student.Age);

foreach (var group in groupedStudents)
{
Console.WriteLine($"Age: {group.Key}");
foreach (var student in group)
{
Console.WriteLine($" - {student.Name}");
}
}

输出

Age: 20
- Alice
- Charlie
Age: 21
- Bob
- Eve
Age: 22
- David

在这个示例中,我们根据学生的年龄将他们分成了三组。每组包含具有相同年龄的学生。

实际应用场景

场景 1:统计每个部门的员工数量

假设我们有一个 Employee 类,其中包含员工的姓名和所属部门。我们希望统计每个部门的员工数量。

csharp
public class Employee
{
public string Name { get; set; }
public string Department { get; set; }
}

var employees = new List<Employee>
{
new Employee { Name = "John", Department = "HR" },
new Employee { Name = "Jane", Department = "IT" },
new Employee { Name = "Mike", Department = "HR" },
new Employee { Name = "Sara", Department = "IT" },
new Employee { Name = "Tom", Department = "Finance" }
};

var departmentCounts = employees
.GroupBy(employee => employee.Department)
.Select(group => new
{
Department = group.Key,
Count = group.Count()
});

foreach (var dept in departmentCounts)
{
Console.WriteLine($"Department: {dept.Department}, Employee Count: {dept.Count}");
}

输出

Department: HR, Employee Count: 2
Department: IT, Employee Count: 2
Department: Finance, Employee Count: 1

在这个场景中,我们使用 GroupBy 方法将员工按部门分组,然后使用 Select 方法计算每个部门的员工数量。

场景 2:按日期分组并计算每日销售额

假设我们有一个 Sale 类,其中包含销售日期和销售额。我们希望按日期分组,并计算每日的总销售额。

csharp
public class Sale
{
public DateTime Date { get; set; }
public decimal Amount { get; set; }
}

var sales = new List<Sale>
{
new Sale { Date = new DateTime(2023, 10, 1), Amount = 100 },
new Sale { Date = new DateTime(2023, 10, 1), Amount = 200 },
new Sale { Date = new DateTime(2023, 10, 2), Amount = 150 },
new Sale { Date = new DateTime(2023, 10, 2), Amount = 300 },
new Sale { Date = new DateTime(2023, 10, 3), Amount = 250 }
};

var dailySales = sales
.GroupBy(sale => sale.Date)
.Select(group => new
{
Date = group.Key,
TotalAmount = group.Sum(sale => sale.Amount)
});

foreach (var day in dailySales)
{
Console.WriteLine($"Date: {day.Date.ToShortDateString()}, Total Sales: {day.TotalAmount}");
}

输出

Date: 10/1/2023, Total Sales: 300
Date: 10/2/2023, Total Sales: 450
Date: 10/3/2023, Total Sales: 250

在这个场景中,我们按日期分组,并计算每日的总销售额。

总结

LINQ 分组操作是处理数据集合时非常有用的工具。通过 GroupBy 方法,我们可以轻松地将数据按指定的键分组,并对每个组进行进一步的操作,如计数、求和等。本文通过多个示例展示了 LINQ 分组的基本用法和实际应用场景,希望能帮助你更好地理解和掌握这一概念。

附加资源与练习

  • 练习 1:创建一个 Product 类,包含产品名称和类别。使用 LINQ 分组操作按类别分组,并统计每个类别的产品数量。
  • 练习 2:创建一个 Order 类,包含订单日期和订单金额。使用 LINQ 分组操作按月份分组,并计算每月的总订单金额。
提示

如果你对 LINQ 分组操作还有疑问,建议查阅 Microsoft 官方文档 获取更多信息。