C#开发-集合使用和技巧(六)特殊转换方法SelectMany的介绍和用法
介绍
SelectMany 方法在C#中用于将集合中的元素转换为其他类型的集合,并将这些集合扁平化为一个单一的序列。它是LINQ的一部分,允许你在一个序列上进行投影和过滤操作,然后将结果合并成一个序列。
方法定义
public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source,Func<TSource, IEnumerable<TResult>> selector
)
使用示例
准备测试类和初始代码
/// <summary>/// 设备/// </summary>public class Device{public int Id { get; set; }public string Name { get; set; }public List<Point> Points { get; set; }public Device(){Points = new List<Point>();}}/// <summary>/// 状态点位/// </summary>public class Point{public string PointId { get; set; }public string Name { get; set; }public int Value { get; set; }}//数据初始化List<Device> list = new List<Device>();list.Add(new Device() { Id = 101, Name = "1号设备", });list.Add(new Device() { Id = 102, Name = "2号设备", });list.Add(new Device() { Id = 103, Name = "3号设备", });list.Add(new Device() { Id = 104, Name = "4号设备", });list[0].Points.Add(new Point { PointId = "101-1", Name = "测试1", Value = 50 });list[0].Points.Add(new Point { PointId = "101-2", Name = "测试2", Value = 50 });list[1].Points.Add(new Point { PointId = "102-3", Name = "测试3", Value = 50 });list[1].Points.Add(new Point { PointId = "102-4", Name = "测试4", Value = 50 });list[1].Points.Add(new Point { PointId = "102-1", Name = "测试1", Value = 20 });list[2].Points.Add(new Point { PointId = "103-2", Name = "测试2", Value = 3 });list[3].Points.Add(new Point { PointId = "104-3", Name = "测试3", Value = 40 });list[3].Points.Add(new Point { PointId = "104-4", Name = "测试4", Value = 40 });
使用:
var points = list.SelectMany(x => x.Points);

返回一个Point 的集合,他将原集合中每个对象的一个子集合,合并成了一个集合
在这个例子中,SelectMany 对每个 Device 对象调用 Points 属性,产生一个 Point对象的序列。然后,SelectMany 将这些序列合并成一个单一的序列 allPoints,其中包含了所有的 Point对象。这样,你就可以遍历 allPoints并访问每个 Point对象的属性,而不需要关心它们属于哪个 Device。

Select与SelectMany对比
对上述集合使用Select和SelectMany
var points1 = list.Select(x => x.Points);var points2 = list.SelectMany(x => x.Points);
查看如下:可以看到Select是返回一个集合的集合,相当于是二维的集合,原有集合保持不变。

而SelectMany则是将各个子集合内容都添加到了同一个集合,这方便我们处理一些集合对象中 带有子集合的情况,可以直接获取到里面的所有对象,然后进行处理,省去了二次处理的麻烦。

结果对比:

特殊情况
在SelectMany中必须返回集合对象IEnumerable<T>,普通类型或者类都无法使用,使用则会报错。

但是有一种特殊情况,string类型可以被使用,这种情况下他被视为字符串数组char[],所以返回的结果也是IEnumerable<char>,这种情况要注意,一般不会使用SelectMany,要获取属性的集合,就使用Select


相关文章:
C#开发-集合使用和技巧(六)特殊转换方法SelectMany的介绍和用法
介绍 SelectMany 方法在C#中用于将集合中的元素转换为其他类型的集合,并将这些集合扁平化为一个单一的序列。它是LINQ的一部分,允许你在一个序列上进行投影和过滤操作,然后将结果合并成一个序列。 方法定义 public static IEnumerable<…...
高考后的抉择:如何在心仪专业与知名学校之间做出选择?
目录 前言1. 专业选择的深度探讨1.1 专业的优势与挑战1.1.1 课程学习1.1.2 就业前景 1.2 专业选择的个人经验与思考 2. 名校对个人发展的长短期影响2.1 名校声誉的品牌效应2.1.1 职业发展2.1.2 社会认可度 2.2 教育资源与学术氛围2.2.1 教育资源2.2.2 学术氛围 2.3 就业优势 3.…...
黄仁勋提到的机器人世界,还需要AI数据来“调教” | CVPR 2024
本周,CVPR 2024正在美国西雅图拉开序幕。今年CVPR论文投稿数再次创下新纪录,可想而知本届会议的火热。 从研究主题来看,具身智能这一大热点值得关注。 黄仁勋在COMPUTEX大会开幕前夕的演讲中预言:AI的下一个浪潮将是物理AI。 即…...
语言中 函数用地址传参的好处
在C语言中,使用地址传参(传递指针)有以下几个好处: 1. **减少内存开销**: - 传递一个指针(通常是一个地址)比传递一个大的结构体或数组要高效得多,因为指针通常是一个固定大小&a…...
Python进阶二: NumPy基础:数组和矢量计算
二、NumPy基础:数组和矢量计算 本文源自微博客(www.microblog.store),且以获得授权 NumPy(Numerical Python的简称)是Python数值计算最重要的基础包。大多数提供科学计算的包都是用NumPy的数组作为构建基础。 NumPy的部分功能如下…...
2024北京智源大会开幕,智源推出大模型全家桶及全栈开源技术基座新版图,大模型先锋集结共探AGI之路
2024年6月14日,第六届“北京智源大会”在中关村展示中心开幕。 北京智源大会是智源研究院主办的“AI内行顶级盛会”,以“全球视野、思想碰撞、前沿引领”为特色,汇聚海内外研究者分享研究成果、探寻前沿知识、交流实践经验。2024北京智源大会…...
李光明从程序员到架构师的逆袭之路(三)
我,李光明,正在参加一个重要的技术会议。会场上,我们团队正在讨论着接口设计以及接口设计模式。我深知,一个好的接口设计应当遵循简洁、清晰、可扩展的原则。比如,在设计一个用户信息查询接口时,我们会定义…...
基于Spring Boot+VUE毕业生信息招聘平台
系统详细设计 1管理员功能模块 管理员登录,管理员通过输入用户名、密码、角色等信息进行系统登录,如图1所示。 图1管理员登录界面图 管理员登录进入毕业生信息招聘平台可以查看首页、个人中心、企业管理、空中宣讲会管理、招聘岗位管理、毕业生管理、个…...
设计模式-创建型-04-建造者模式
1、盖房项目需求 1)需要建房子:这一过程为打桩、砌墙、封顶2)房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的3)请编写程序…...
jenkins中配置参数化,并在python脚本接收参数实现参数化执行
在公司内进行Monkey测试脚本集成jenkins时,因为需要指定公司内不同的app进行测试。那么可以有两种方法解决该问题,要么创建多个脚本文件,多个jenkins jobs,进行构建。要么可以在配置job时通过传参数的方式,在python脚本…...
【SCAU数据挖掘】数据挖掘期末总复习题库应用题及解析
1. 给定圆的半径为e ,令 MinPts3,考虑下面两幅图。 (1)哪些对象是核心对象? m,p,o,r(因为这些核心对象在半径e的范围内都至少包含MinPts3个对象) (2)哪些对象是直接密度可达的? 对象q是…...
ADB->获取当前正在显示的Fragment和Activity的ADB命令
获取当前显示的Activity adb shell "dumpsys window | grep mCurrentFocus"指令拆解adb shell:启动一个远程shell来运行设备上的命令dumpsys window:获取当前窗口管理器的信息|:将前一个命令的输出作为后一个命令的输入grep mCurr…...
C#——集合List
list list集合和Arraylist基本一样,只不过list是C#2.0版本新加入的范型类型。list也可以通过索引操作里面的元素,也有对list进行增删改查 概念 Array静态数组 * Arraylist 动态数组 * list集合 * 1. Array是容量是固定的,但是ArrayList和…...
小程序-生命周期(2) 应用周期/页面周期
一.应用周期 应用周期指的是小程序:启动->运行->销毁的整个过程。 应用周期伴随一些函数来进行控制,这些函数卸载app.js里面的App方法里。 分别由onLaunch, onShow,onHide依次进行。 onLaunch:初始化的时候运行…...
什么是模板字符串?
模板字符串(Template Literals)是ES6(ECMAScript 2015)中引入的一种新的字符串表示方法,允许我们嵌入表达式,并在运行时将它们转换为字符串。模板字符串使用反引号()来定义ÿ…...
服务器数据恢复—热备盘未完全启用导致raid5阵列崩溃的数据恢复案例
服务器存储故障: 一台EMC某型号存储由于存储中raid5阵列出现故障导致服务器崩溃,由于数据涉密,需要工程师到现场恢复数据。 服务器数据恢复工程师到现场后对数据进行检测,经过检测发现服务器崩溃是由于raid中某些硬盘掉线所导致。…...
微服务项目雪崩的解决思路
雪崩的介绍 雪崩是微服务中某个服务挂了,无法返回请求,导致调用改服务的上层服务也故障,最终形成连锁反应,导致整个系统故障。 解决思路 一般有四种思路: 1.最简单的就是超时处理,即超过一段时间就返回…...
汇编语言程序设计 - 新建一个文件:d:\abc.txt,从键盘输入文件的内容(不超过100个字符)
80x86汇编习题 题目描述:编写一个程序,新建一个文件:d:\abc.txt,从键盘输入文件的内容(不超过100个字符) 思路: 1,定义好文件名,记得末尾0 2,定义好缓冲区…...
【Linux】进程间通信2——命名管道
1. 命名管道(FIFO) 1.1. 基本概念 简单,给匿名管道起个名字就变成了命名管道 那么如何给 匿名管道 起名字呢? 结合文件系统,给匿名管道这个纯纯的内存文件分配 inode,将文件名与之构建联系,关键点在于不给它分配 D…...
语音翻译软件app排名来啦,这些工具让旅游畅通无阻
#这个夏天我们一定要去看海# 出国旅行时,语言障碍常常是最让人头疼的问题之一。 特别是在像缅甸这样英语并不普及的国家,基本的日常交流,比如用餐或问路,都可能成为难题。 然而,随着技术的进步,现在有了…...
南北阁Nanbeige 4.1-3B实现AIGC应用:内容生成实战案例
南北阁Nanbeige 4.1-3B实现AIGC应用:内容生成实战案例 1. 模型效果概览 南北阁Nanbeige 4.1-3B作为一款轻量级大语言模型,在AIGC内容生成领域展现出了令人惊喜的能力。虽然参数量相对较小,但在实际测试中,它在文本创作、代码生成…...
别再只当开关用了!聊聊MOS管里那个‘多余’的体二极管,到底能帮你省多少事
解锁MOS管体二极管的隐藏技能:从电路保护到能量回收的实战指南 在电子设计领域,MOS管常被视为完美的电子开关——快速、高效且易于控制。但许多工程师可能没有意识到,MOS管内部那个看似"多余"的体二极管,实际上是一个被…...
思源宋体TTF:5个高效技巧提升你的中文排版专业度
思源宋体TTF:5个高效技巧提升你的中文排版专业度 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为中文排版效果不佳而烦恼吗?思源宋体TTF字体库为你提供了…...
告别重复造轮子:用快马平台一键生成高效yolov11开发模板
告别重复造轮子:用快马平台一键生成高效yolov11开发模板 最近在做一个基于yolov11的目标检测项目,发现从零开始搭建开发环境特别费时间。光是配环境、写基础代码、整合工具链这些重复性工作,就占用了将近一半的开发周期。后来尝试用InsCode(…...
Phi-3-mini-128k-instruct数学推理能力展示:求解方程与几何证明
Phi-3-mini-128k-instruct数学推理能力展示:求解方程与几何证明 最近,我花了不少时间测试微软开源的Phi-3-mini-128k-instruct模型,想看看它在数学推理这块到底行不行。毕竟,一个模型如果能清晰、有条理地解决数学问题࿰…...
Unity游戏开发实战:用三阶贝塞尔曲线为你的角色设计一条丝滑的移动路径(附完整C#脚本)
Unity游戏开发实战:三阶贝塞尔曲线打造丝滑角色移动路径 想象一下,你的游戏角色需要完成一个优雅的空中翻转动作,或者赛车需要在弯道实现完美漂移轨迹。这些令人惊叹的运动效果背后,往往隐藏着一条看不见的数学曲线——贝塞尔曲线…...
Qwen3-0.6B-FP8部署详解:如何用16GB显存跑通FP8量化版Qwen3轻量推理
Qwen3-0.6B-FP8部署详解:如何用16GB显存跑通FP8量化版Qwen3轻量推理 想体验最新的大语言模型,但被动辄几十GB的显存需求劝退?今天,我们来解决这个痛点。 Qwen3系列模型以其强大的推理和对话能力备受关注,但其标准版本…...
ESP32无线心情记录仪设计与物联网应用
1. 基于ESP32的无线心情记录仪设计与实现1.1 项目背景与功能概述现代工程师工作压力大,情绪波动频繁,需要有效的情绪管理工具。本项目设计了一款基于无线射频技术的情绪记录装置,通过物理按键触发和云端数据记录的方式,帮助用户量…...
Anthropic提示工程教程:从入门到精通的完整指南
Anthropic提示工程教程:从入门到精通的完整指南 【免费下载链接】prompt-eng-interactive-tutorial Anthropics Interactive Prompt Engineering Tutorial 项目地址: https://gitcode.com/GitHub_Trending/pr/prompt-eng-interactive-tutorial Anthropic的交…...
手把手教你用Swaks和Gophish绕过SPF,搭建自己的邮件钓鱼测试环境(附避坑指南)
企业级邮件安全测试实战:从SPF绕过到钓鱼环境搭建 邮件安全测试已成为企业安全防护体系中不可或缺的一环。据统计,超过90%的网络攻击始于钓鱼邮件,而其中近40%的成功攻击源于SPF配置不当或完全缺失。本文将系统性地介绍如何构建一个完整的邮件…...
