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 官方文档 获取更多信息。