SelectMany C#

SelectMany 是 LINQ 里“先映射,再拍平”的方法,核心作用是把“集合里的每个元素再对应一个子集合”合并成一个一维序列。

一句话理解:
Select 是一对一映射;
SelectMany 是一对多映射并把结果展开。

常见场景
1. 一个班级有多个学生,想拿到所有学生列表
2. 一个订单有多个明细,想拿到所有明细
3. 需要做“外层 + 内层”联合投影(例如 部门名 + 员工名)

基础示例(拍平)
List<List<int>> nums = new()
{
new() { 1, 2 },
new() { 3, 4, 5 }
};

var flat = nums.SelectMany(x => x);
// 结果: 1,2,3,4,5

对象示例(班级 -> 学生)
var classes = new[]
{
new { Name = "一班", Students = new[] { "张三", "李四" } },
new { Name = "二班", Students = new[] { "王五" } }
};

var allStudents = classes.SelectMany(c => c.Students);
// 结果: 张三, 李四, 王五

带结果投影(同时拿外层信息)
var pairs = classes.SelectMany(
c => c.Students,
(c, s) => new { ClassName = c.Name, StudentName = s }
);
// 结果:
// {ClassName=一班, StudentName=张三}
// {ClassName=一班, StudentName=李四}
// {ClassName=二班, StudentName=王五}

和 Select 的区别
1. Select 返回“每项映射后的序列”,如果映射到子集合,结果会是二维
2. SelectMany 会自动把这些子集合合成一维

语法糖对应(查询表达式)
from c in classes
from s in c.Students
select new { c.Name, s }

这段本质上就是 SelectMany。

如果你愿意,我可以下一条给你一个“最常见面试题”:Select、SelectMany、Join 三者该怎么选。

posted on 2026-06-06 20:05  漫思  阅读(5)  评论(0)    收藏  举报

导航