SelectMany用于将集合的集合扁平化为单层集合,支持投影、过滤与关联操作。例如,从学生列表中提取所有课程:var allCourses = students.SelectMany(s => s.Courses); 可保留上下文信息,如学生姓名与序号:.SelectMany((s, i) => s.Courses.Select(c => new { StudentName = s.Name, Course = c, Order = i })); 能替代嵌套循环,实现声明式数据处理,链式调用Where、OrderBy等方法筛选并排序课程:.Where(c => c.Contains("数")).OrderBy(c => c); 还可模拟内连接,结合Join完成订单与商品的关联查询,是处理层级结构如树形、用户角色等场景的核心工具。

SelectMany 的核心作用是把“集合中的集合”变成一个单层的集合,也就是常说的扁平化(Flattening)。它不只适用于简单嵌套,还能配合投影、过滤和关联逻辑使用,是处理层级数据结构(比如树形、订单+商品、用户+角色等)时非常实用的操作符。
这是最直观的用途。比如你有一组学生,每个学生有多个课程,你想得到所有课程的列表:
var students = new[]
{
new Student { Name = "张三", Courses = new[] { "数学", "英语" } },
new Student { Name = "李四", Courses = new[] { "物理", "化学", "生物" } }
};
var allCourses = students.SelectMany(s => s.Courses);
// 结果:{"数学", "英语", "物理", "化学", "生物"}
这里 s => s.Courses 是一个“选择子集合”的函数,SelectMany 会自动遍历每个学生,并把他们的 Courses 合并成一个序列。
有时你不仅需要扁平后的元素,还想保留外层上下文,比如知道某个课程属于哪个学生。SelectMany 重载支持传入带索引的 selector,或者用更灵活的二元 lambda:
(student, index) 获取学生本身和位置var coursesWithStudent = students
.SelectMany(
(s, i) => s.Courses.Select(c => new { StudentName = s.Name, Course = c, Order = i })
);
结果每项都包含学生名、课程名和该学生在原数组中的序号。
传统写法要两层循环才能拿到所有“学生-课程”对,而 SelectMany 让这种关联变得声明式且可链式调用:
AI Code Reviewer
AI自动审核代码
112
查看详情
.Where() 筛选特定课程.OrderBy() 统一排序GroupBy 配合做反向聚合(如按课程统计学生数)例如:找出所有含“数”字的课程,并按课程名排序:
var mathRelated = students
.SelectMany(s => s.Courses)
.Where(c => c.Contains("数"))
.OrderBy(c => c);
当两个集合存在一对多关系时,SelectMany + Where 可实现类似 SQL INNER JOIN 的效果:
var orders = GetOrders();
var products = GetProducts();
// 找出订单中包含的全部产品(假设 Order 有 ProductIds)
var orderProducts = orders
.SelectMany(o => o.ProductIds, (o, pid) => new { Order = o, ProductId = pid })
.Join(products, op => op.ProductId, p => p.Id, (op, p) => new { op.Order, Product = p });
虽然 Join 更直接,但 SelectMany 提供了更底层、更可控的配对方式,尤其适合动态条件或复杂映射。
基本上就这些 —— 它不是炫技工具,而是解决“我要从多层结构里一口气拉出所有叶子节点”这类问题的自然表达。用熟了,代码会更短,意图也更清晰。
以上就是C# LINQ中的SelectMany有什么用 - 将嵌套集合扁平化的详细内容,更多请关注其它相关文章!
# 是一个
# 对淘宝店的营销推广总结
# 寻甸营销推广售后服务
# 阿里营销自助推广
# 镇江小语种网站推广
# 泉州seo整站
# 网站页面优化工具有哪些
# seo丹尼尔外套
# 东莞网站建设哪家更好
# 营销推广多少钱报工商
# 济源网络短视频营销推广
# 这是
# 工具
# 拉出
# 如何实现
# 英语
# 重写
# 什么用
# 数据结构
# 扁平化
# 链式
# c#
# ai
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
《小黑盒》删除历史浏览方法
windows10怎么更改下载路径_windows10默认存储位置修改教程
12306APP选座怎么选充电位置_12306APP带充电插座座位选择方法与技巧
《王者荣耀世界》英雄获取攻略
win11资源管理器标签页怎么用 Win11文件管理器多标签高效操作【新功能】
TikTok视频播放中断怎么办 TikTok播放异常修复方法
Excel怎么用XLOOKUP函数实现双向查找_ExcelXLOOKUP替代VLOOKUP+HLOOKUP的高级用法
苹果电脑如何快速截图并编辑 苹果电脑截屏标注快捷操作
阿里旺旺电脑网页版入口 阿里旺旺电脑版网页登录入口
太平年在哪个平台播出
抖音网页版官方链接 抖音网页版官网链接入口
AO3中文入口稳定分享_AO3官网HTTPS看文详解
DeepSeek超全面指南:入门必看
一点万象签到领积分指南
《书耽》更换手机号方法
使用VS Code调试Python代码:从入门到精通
TikTok网页版实时观看入口 TikTok网页版短视频在线浏览
网站体验不好=浪费钱:如何提升-用户体验效果差
PHP 4 函数中引用参数的默认值限制与解决方案
六级准考证号怎么查_四六级准考证查询入口官网
Flash AS3.0简易相册制作
百度竞价WAP显示PC链接问题
win11如何诊断DirectX问题 Win11运行dxdiag工具排查显卡故障【排错】
解决VS Code中Python版本冲突与输出异常的指南
lol小红书怎么|直播|?lol小红书|直播|是什么意思?
服装短视频如何起号推广?服装短视频起号推广有什么要求?
263企业邮箱如何设置邮件转发功能
优化2xN网格最大路径和的动态规划算法实践
QQ邮箱PC端登录页面_QQ邮箱网页版登录界面
qq邮箱怎么注册_QQ邮箱注册步骤与注意事项
Sublime怎么配置YAML文件格式化_Sublime YAML Formatter插件教程
Yandex浏览器官方入口_Yandex搜索引擎中文版
解决Pandas DataFrame高度碎片化警告:高效创建多列的策略
店铺如何关联视频号推广?视频号推广有什么用?
我的世界游戏平台入口 我的世界官方官网直达链接
《土豆雅思》修改密码方法
C++怎么解决数值计算中的精度问题_C++浮点数误差与数值稳定性分析
C#解析并修改XML后保存 如何确保格式与编码的正确性
《长生:天机降世》火塔小怪大全
鲁班大师乓乓皮肤获取方法
Python模块化编程:避免循环导入与共享函数的最佳实践
J*a列表元素格式化输出教程
苹果如何下载nanobanana
mysql触发器如何编写_mysql触发器编写规范与代码示例讲解
《华夏千秋》龙女试炼功法获取方法
支付宝登录刷脸不是本人如何解决
Microsoft Edge网页字体太淡看不清怎么办_Microsoft Edge字体渲染优化技巧
学习通网页版个人登录_学习通网页版个人账户登录入口
优化Google Charts Gauge:在数据库无数据时显示默认值
抖音号显示企业机构号是什么意思?企业机构号申请条件是什么?
2025-12-13
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。