信息发布→ 登录 注册 退出

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


相关文章: 动漫岛观看全网网 动漫岛在线正版动漫入口  在哪找SublimeJ远程工具_SFTP插件配置教程  HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全  steam官方入口大全 steam账号注册及操作指南  如何在Promise链中优雅地中断后续then执行  CSS响应式网页如何实现主次模块比例自适应_flex-grow与flex-shrink调整  深入理解与实现最大堆的Heapify过程:常见错误与修正  c++如何使用Meson构建系统_c++比CMake更快的构建工具  虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作  mc.js游戏直达 mc.js网页免下载版本秒进地址  必由学官方网站入口 必由学学生教师共用登录通道  c++ 命名空间怎么用 c++ namespace使用指南  PHP教程:高效从URL路径中提取倒数第二个片段  WooCommerce后台产品编辑页:获取分类ID并实现角色权限控制  蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台  迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法  铁路12306官网网页端快速入口 铁路12306官方首页登录教程  漫蛙2在线漫画入口 漫蛙正版漫画网页版直达  Python Socket多播通信中指定源IP地址的实践指南  win11跳过OOBE三种方法 Win11跳过OOBE设置步骤  Composer如何在生产环境安全地执行composer update  在python-socketio事件处理器中安全访问Flask应用上下文  Typer应用中动态命令行参数的解析与处理  React Router 嵌套组件中 URL 重定向问题的解决方案  Win11怎么开启高性能模式_Windows 11电源计划优化设置  Lar*el开发:如何在编辑界面正确预选数据库中的多选标签  word邮件合并后日期格式不对怎么改_Word邮件合并日期格式修改方法  163邮箱注册官网 免费申请163个人邮箱  抖音从哪里进入网页版_抖音官方入口链接  J*a TimerTask中HashMap意外清空的深层原因与解决方案  PHP中SSG-WSG API的AES加密实践:正确使用初始化向量  文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】  解决Python单元测试中Mock异常方法调用计数为零的问题  如何修改开机登录密码_Windows账户安全设置超详细教程【必学】  Node.js中HTML按钮与J*aScript函数交互的正确姿势  192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台  如何使用 Excel 发布器与 Power BI 分享 Excel 洞察  React Hooks最佳实践:动态组件状态管理的组件化方案  Python中如何避免重复条件判断:利用数据结构实现动态逻辑  Mac怎么使用表情符号_Mac Emoji快捷键面板  《GTA6》开发画面疑似泄露!这次可不是AI了  创客贴用户入口官网登录 创客贴网页版电脑版系统  QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录  解决Bootstrap卡片顶部边距导致背景图下移的问题  mcjs网页版流畅运行 mcjs低配电脑畅玩入口  如何在CSS中使用浮动制作导航栏_float实现水平菜单  J*a如何实现并发下载文件_J*a多线程IO性能优化案例  Spyder启动失败:字体文件权限拒绝错误解决方案  Win11截图该按哪些键 Win11截屏完整流程解析【教程】  抖音网页版怎么|直播|_抖音网页版开播操作指南 

在线客服
服务热线

服务热线

4008988990

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

截屏,微信识别二维码

打开微信

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