























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 三者该怎么选。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。