Lambda 和 LINQ
掌握 Lambda 表达式的语法与使用场景
理解委托的基本概念
熟练使用 LINQ 方法操作集合数据
核心讲解
(1)Lambda 表达式
匿名方法的简写,用来创建委托实例,简洁高效。
语法:
(参数列表) => 表达式/语句块参数类型可以省略,编译器推断
一个参数可以省略括号
常用于:LINQ、异步、事件、委托参数
(2)常用委托类型
Action:无返回值的委托Action<T>:有参数无返回Func<TResult>:无参数有返回Func<T, TResult>:有参数有返回
(3)LINQ 语言集成查询
用来操作集合数据,像 SQL 一样查询,语法简洁,功能强大。
命名空间:
System.Linq两种写法:方法语法(推荐)、查询语法
常用方法:
Where():过滤Select():投影 / 转换OrderBy()/OrderByDescending():排序FirstOrDefault():取第一个,没有返回默认Any():是否有满足条件的Count():计数Sum()/Max()/Min()/Average():聚合GroupBy():分组
操作步骤
用 Lambda 配合委托使用
用 LINQ 处理学生集合:过滤、排序、投影
运行验证
代码示例
using System.Linq;
List<Student> students = new List<Student>
{
new Student { Name = "张三", Age = 20, Score = 90 },
new Student { Name = "李四", Age = 19, Score = 85 },
new Student { Name = "王五", Age = 21, Score = 95 },
new Student { Name = "赵六", Age = 18, Score = 78 },
new Student { Name = "钱七", Age = 20, Score = 88 }
};
// ===== Lambda + 委托 =====
Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine("Lambda求和:" + add(10, 20));
Action<string> print = s => Console.WriteLine(s);
print("Hello Lambda");
// ===== LINQ 查询 =====
// 1. 过滤:分数大于85
var goodStudents = students.Where(s => s.Score > 85).ToList();
Console.WriteLine("\n85分以上:");
foreach (var s in goodStudents)
Console.WriteLine($"{s.Name}:{s.Score}");
// 2. 排序:按年龄降序
var ordered = students.OrderByDescending(s => s.Age).ToList();
// 3. 投影:只取名字
var names = students.Select(s => s.Name).ToList();
Console.WriteLine("\n所有姓名:" + string.Join("、", names));
// 4. 聚合
double avgScore = students.Average(s => s.Score);
int maxScore = students.Max(s => s.Score);
Console.WriteLine($"\n平均分:{avgScore:F1},最高分:{maxScore}");
// 5. 分组:按年龄分组
var ageGroups = students.GroupBy(s => s.Age);
Console.WriteLine("\n按年龄分组:");
foreach (var group in ageGroups)
{
Console.WriteLine($"{group.Key}岁:{group.Count()}人");
}
Console.ReadKey();
常见误区
LINQ 不导命名空间:必须 using System.Linq,不然方法不显示
LINQ 查询立即执行:LINQ 是延迟执行的,遍历、ToList、ToArray 时才真正执行
FirstOrDefault 不判空:没有符合条件的返回默认值,引用类型是 null,要做空判断
复杂查询全用查询语法:方法语法更灵活,配合 Lambda 更清晰
课后练习
创建一个 10 个数字的列表,用 LINQ 过滤出偶数,乘 2,排序
从学生列表中找出年龄最大的学生
统计所有学生的总分、平均分、最低分
思考:LINQ 相比自己写循环遍历有什么优势?

