编辑
2025-10-11
C#
00

目录

准备工作
在 .NET 6 之前如何获取最高/最低分学生
使用 MaxBy() 找到最高分
使用 MinBy() 找到最低分
总结

随着 .NET 6 的发布,LINQ 中新增了两个便捷的扩展方法:

  • MinBy(Func<T, TKey> keySelector)
  • MaxBy(Func<T, TKey> keySelector)

它们能根据指定的键(keySelector)从集合中一次性取得最小值或最大值所在的整个对象(而不仅仅是数值)。拥有这两个方法后,我们无需再手工使用 OrderBy() + First() 或者 OrderByDescending() + First() 的组合来取极值对象,代码变得更加简洁,也能避免没必要的排序操作,效率更高。

准备工作

在开始动手实验之前,我们先定义一个简单的 Student 记录类型,并创建一个学生列表,包含学生的姓名和分数等信息。示例如下:

C#
namespace AppMin { public record Student(string Name, int Marks); internal class Program { static void Main(string[] args) { // 创建学生列表 var students = new List<Student> { new Student("张三", 520), new Student("李四", 480), new Student("王五", 550), new Student("张飞", 430), new Student("关羽", 550) }; // 打印数据,确保数据已经正确初始化 foreach (var student in students) { Console.WriteLine($"{student.Name} - {student.Marks}"); } } } }

在 .NET 6 之前如何获取最高/最低分学生

在 .NET 6 之前,如果要从列表中查询最高或最低分对应的学生,通常需要先对数据进行排序,再用 First()Last() 取出第一条或最后一条记录。例如,查询最高分学生:

C#
namespace AppMin { public record Student(string Name, int Marks); internal class Program { static void Main(string[] args) { // 创建学生列表 var students = new List<Student> { new Student("张三", 520), new Student("李四", 480), new Student("王五", 550), new Student("张飞", 430), new Student("关羽", 550) }; // 打印数据,确保数据已经正确初始化 foreach (var student in students) { Console.WriteLine($"{student.Name} - {student.Marks}"); } // .NET 6 之前的做法(获取最高分) var topStudentLegacy = students .OrderByDescending(s => s.Marks) .First(); Console.WriteLine($"(之前做法) 最高分学生: {topStudentLegacy.Name}, 分数: {topStudentLegacy.Marks}"); Console.ReadKey(); } } }

image.png

查询最低分学生类似,只是将 OrderByDescending 换为 OrderBy,或按照其他方式灵活组合:

C#
namespace AppMin { public record Student(string Name, int Marks); internal class Program { static void Main(string[] args) { // 创建学生列表 var students = new List<Student> { new Student("张三", 520), new Student("李四", 480), new Student("王五", 550), new Student("张飞", 430), new Student("关羽", 550) }; // 打印数据,确保数据已经正确初始化 foreach (var student in students) { Console.WriteLine($"{student.Name} - {student.Marks}"); } // .NET 6 之前的做法(获取最低分) var lowestStudentLegacy = students .OrderBy(s => s.Marks) .First(); Console.WriteLine($"(之前做法) 最低分学生: {lowestStudentLegacy.Name}, 分数: {lowestStudentLegacy.Marks}"); Console.ReadKey(); } } }

image.png

尽管这样的做法也能正确获取结果,但毕竟是对完整的列表进行了排序,对大型数据集合来说是多余的计算。

使用 MaxBy() 找到最高分

.NET 6 新增的 MaxBy(keySelector) 方法可以直接根据指定的键选出最大值对应的对象,无需再显式排序。示例:

C#
// 获取最高分学生 var topStudent = students.MaxBy(s => s.Marks); Console.WriteLine($"(MaxBy) 最高分学生: {topStudent.Name}, 分数: {topStudent.Marks}");

image.png

如果有多名学生分数相同,MaxBy 会返回列表中出现的第一位最高分学生(从前到后搜索)。

使用 MinBy() 找到最低分

同理,使用 MinBy(keySelector) 则能快速获取最低分学生。示例:

C#
// 获取最低分学生 var lowestStudent = students.MinBy(s => s.Marks); Console.WriteLine($"(MinBy) 最低分学生: {lowestStudent.Name}, 分数: {lowestStudent.Marks}");

image.png

同样地,如果分数出现重复,MinBy 会返回列表中出现的第一位最低分对象。

总结

  • MinBy() 与 MaxBy():基于某一键的最小值或最大值,一步获取完整对象,避免不必要的排序。
  • 相比传统做法:无需使用 OrderBy() / OrderByDescending() + First() / Last(),一行代码即可完成操作,而且在处理大型集合时通常效率更高。

通过这篇小结,我们不仅获得了如何使用 MinBy()MaxBy() 的入门示例,也了解了它们在 .NET 6 中为 LINQ 查询带来的简洁与高效。如果你想要更深入地学习 LINQ,建议多写些示例,也可以从官方文档或社区资源中了解更多进阶用法。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!