随着 .NET 6 的发布,LINQ 中新增了两个便捷的扩展方法:
它们能根据指定的键(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 之前,如果要从列表中查询最高或最低分对应的学生,通常需要先对数据进行排序,再用 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();
}
}
}
查询最低分学生类似,只是将 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();
}
}
}
尽管这样的做法也能正确获取结果,但毕竟是对完整的列表进行了排序,对大型数据集合来说是多余的计算。
.NET 6 新增的 MaxBy(keySelector)
方法可以直接根据指定的键选出最大值对应的对象,无需再显式排序。示例:
C#// 获取最高分学生
var topStudent = students.MaxBy(s => s.Marks);
Console.WriteLine($"(MaxBy) 最高分学生: {topStudent.Name}, 分数: {topStudent.Marks}");
如果有多名学生分数相同,MaxBy
会返回列表中出现的第一位最高分学生(从前到后搜索)。
同理,使用 MinBy(keySelector)
则能快速获取最低分学生。示例:
C#// 获取最低分学生
var lowestStudent = students.MinBy(s => s.Marks);
Console.WriteLine($"(MinBy) 最低分学生: {lowestStudent.Name}, 分数: {lowestStudent.Marks}");
同样地,如果分数出现重复,MinBy
会返回列表中出现的第一位最低分对象。
通过这篇小结,我们不仅获得了如何使用 MinBy()
和 MaxBy()
的入门示例,也了解了它们在 .NET 6 中为 LINQ 查询带来的简洁与高效。如果你想要更深入地学习 LINQ,建议多写些示例,也可以从官方文档或社区资源中了解更多进阶用法。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!