信息发布→ 登录 注册 退出

C# LINQ中的SelectMany有什么用 - 将嵌套集合扁平化

发布时间:2025-12-13

点击量:
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完成订单与商品的关联查询,是处理层级结构如树形、用户角色等场景的核心工具。

c# linq中的selectmany有什么用 - 将嵌套集合扁平化

SelectMany 的核心作用是把“集合中的集合”变成一个单层的集合,也就是常说的扁平化(Flattening)。它不只适用于简单嵌套,还能配合投影、过滤和关联逻辑使用,是处理层级数据结构(比如树形、订单+商品、用户+角色等)时非常实用的操作符。

基础扁平化:把 List> 变成 List

这是最直观的用途。比如你有一组学生,每个学生有多个课程,你想得到所有课程的列表:

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 })
    );

结果每项都包含学生名、课程名和该学生在原数组中的序号。

替代多层 foreach,简化嵌套查询逻辑

传统写法要两层循环才能拿到所有“学生-课程”对,而 SelectMany 让这种关联变得声明式且可链式调用:

拾贝 拾贝

一键同步微信读书所有笔记和划线,并在新标签页回顾

拾贝 186 查看详情 拾贝
  • 可以接 .Where() 筛选特定课程
  • 可以接 .OrderBy() 统一排序
  • 能和 GroupBy 配合做反向聚合(如按课程统计学生数)

例如:找出所有含“数”字的课程,并按课程名排序:

var mathRelated = students
    .SelectMany(s => s.Courses)
    .Where(c => c.Contains("数"))
    .OrderBy(c => c);

模拟 inner join(与 Select 配合)

当两个集合存在一对多关系时,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有什么用 - 将嵌套集合扁平化的详细内容,更多请关注其它相关文章!


相关文章: mc.js官网登录入口 mc.js官方登录入口最新版  如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】  C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用  使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战  taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧  Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法  TikTok网页版直接登录 TikTok网页端官方平台入口  mc.js免安装版 mc.js一键畅玩入口  mcjs网页版在线存档 mcjs云存档登录入口  QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录  谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问  Python实现多节点属性重叠度分析教程  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度  顺丰国际快递查询 国际件官方查询入口  圆通快递查询实时追踪 圆通物流包裹状态快速查看  58动漫网在线官方网 58动漫网正版动漫入口网址  可靠CSGO开箱平台解析 CSGO开箱网合集  谷歌google账号注册详细步骤 谷歌账号注册官方教程  抓大鹅解压小游戏 抓大鹅摸鱼解压入口  红果短剧网页版官网入口 官方最新网址发布  漫蛙漫画网页端入口 漫蛙2官方正版漫画站点  神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正  React Router 嵌套组件中 URL 重定向问题的解决方案  FullCalendar 自定义按钮样式定制指南  Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置  Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】  C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器  Go语言HTML解析:利用Goquery精准获取指定元素内容  汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口  HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解  优化大型XML文件解析:基于Python流式处理的内存高效方案  荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程  德邦快递查询平台 德邦快递物流信息查询入口  Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程  腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录  如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension  曝R星经典之作开发图 设计简陋但信息密集!  HTML长属性值处理:表单action路径优化与代码规范应对  反效果?《战地6》免费试玩开启后玩家数不升反降  Angular响应式表单:实现提交后表单及按钮的禁用与只读化  J*a初级项目如何接入API数据_第三方接口请求与响应解析  J*aScript:在map操作中高效处理空数组  CKEditor 5 自定义构建在React应用中渲染失败的调试与解决  PHP中获取MongoDB服务器运行时间(Uptime)的专业指南  WooCommerce 购物车显示所有交叉销售商品教程  豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售  Yandex免登录网页版地址 Yandex搜索引擎官方访问入口  怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】  AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!