LINQ通过GroupBy实现数据分组,结合OrderBy对组内或分组结果排序,支持多级分组与聚合操作,提升数据查询效率。

LINQ(Language Integrated Query)是.NET中非常强大的数据查询工具,能够以简洁、可读性强的方式对集合进行筛选、排序、分组等操作。在实际开发中,我们经常需要对数据按某个字段分组,并在每组内或整体上进行排序。本文将详细介绍如何使用LINQ实现集合的分组与排序操作。
在LINQ中,group by关键字用于根据指定条件对集合中的元素进行分组。分组后返回的是一个IGrouping<TKey, TElement>类型的集合,每个分组包含一个键(Key)和该键对应的一组元素。
例如,有一个学生列表,我们希望按“班级”进行分组:
var students = new List<Student>
{
new Student { Name = "张三", Class = "一班", Score = 85 },
new Student { Name = "李四", Class = "二班", Score = 90 },
new Student { Name = "王五", Class = "一班", Score = 78 },
new Student { Name = "赵六", Class = "二班", Score = 95 }
};
<p>var grouped = students.GroupBy(s => s.Class);</p><p>foreach (var group in grouped)
{
Console.WriteLine($"班级: {group.Key}");
foreach (var student in group)
{
Console.WriteLine($" - {student.Name}: {student.Score}");
}
}
上面代码会输出两个分组:一班和二班,每组包含对应的学生信息。
分组完成后,常常需要对每组内的元素进行排序。可以使用OrderBy或OrderByDescending方法对组内数据排序。
比如,我们希望每个班级内的学生按成绩从高到低排序:
var groupedWithSort = students
.GroupBy(s => s.Class)
.Select(g => new
{
Class = g.Key,
Students = g.OrderByDescending(s => s.Score).ToList()
});
<p>foreach (var item in groupedWithSort)
{
Console.WriteLine($"班级: {item.Class}");
foreach (var student in item.Students)
{
Console.WriteLine($" - {student.Name}: {student.Score}");
}
}
这里通过Select投影出新对象,保留班级名和排序后的学生列表,实现组内排序。
除了组内排序,有时也需要按分组的“键”或组的聚合信息(如每组人数、平均分等)对整个分组结果排序。
例如,按班级平均分从高到低排序所有班级:
var sortedGroups = students
.GroupBy(s => s.Class)
.Select(g => new
{
Class = g.Key,
AverageScore = g.Average(s => s.Score),
Students = g.OrderByDescending(s => s.Score).ToList()
})
.OrderByDescending(g => g.AverageScore); // 按平均分排序
<p>foreach (var item in sortedGroups)
{
Console.WriteLine($"班级: {item.Class}, 平均分: {item.AverageScore:F2}");
foreach (var student in item.Students)
{
Console.WriteLine($" - {student.Name}: {student.Score}");
}
}
这样不仅实现了组内排序,还让班级之间按平均成绩高低排列。
LINQ也支持多级分组。例如先按班级分组,再在每个班级内按成绩等级(如优秀、良好)二次分组。
假设定义成绩等级逻辑:
var nestedGroup = students
.GroupBy(s => s.Class)
.Select(g => new
{
Class = g.Key,
PerformanceGroups = g
.GroupBy(s => s.Score >= 85 ? "优秀" : "良好")
.Select(pg => new
{
Level = pg.Key,
Students = pg.OrderBy(s => s.Name)
})
});
<p>foreach (var cls in nestedGroup)
{
Console.WriteLine($"班级: {cls.Class}");
foreach (var levelGroup in cls.PerformanceGroups)
{
Console.WriteLine($" 等级: {levelGroup.Level}");
foreach (var student in levelGroup.Students)
{
Console.WriteLine($" - {student.Name}: {student.Score}");
}
}
}
这种嵌套结构适合处理复杂的数据分类场景。
基本上就这些。LINQ的分组与排序组合灵活,配合Lambda表达式和匿名类型,能高效完成各种数据聚合需求。掌握GroupBy、OrderBy及Select的链式调用,就能轻松应对大多数业务中的数据整理任务。
以上就是.NET如何使用LINQ对集合进行分组和排序_LINQ分组排序操作详解的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号