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排名来啦,这些工具让旅游畅通无阻
#这个夏天我们一定要去看海# 出国旅行时,语言障碍常常是最让人头疼的问题之一。 特别是在像缅甸这样英语并不普及的国家,基本的日常交流,比如用餐或问路,都可能成为难题。 然而,随着技术的进步,现在有了…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
