C#开发-集合使用和技巧(五)集合中的转换方法

在C#中,Select, ToList, 和 ToArray 都是用于集合转换的方法,它们各自有不同的用途和适用场景。

测试数据

     /// <summary>
     /// 设备类
     /// </summary>
    class Device
   {
       /// <summary>
       /// Id
       /// </summary>
       public int Id { get; set; }

       /// <summary>
       /// 设备类型
       /// </summary>
       public string Type { get; set; }

       /// <summary>
       /// 名称
       /// </summary>
       public string Name { get; set; }

       /// <summary>
       /// 测试结果
       /// </summary>
       public int Result { get; set; }


   }
 
 
 //初始化数据
 List<Device> list = new List<Device>();
 list.Add(new Device() { Id = 101, Name = "1号设备", Type = "生产设备", Result = 99 });
 list.Add(new Device() { Id = 102, Name = "2号设备", Type = "生产设备", Result = 60 });
 list.Add(new Device() { Id = 103, Name = "3号设备", Type = "测试设备", Result = 98 });
 list.Add(new Device() { Id = 104, Name = "4号设备", Type = "测试设备", Result = 70 });
 list.Add(new Device() { Id = 201, Name = "5号生产设备", Type = "生产设备", Result = 100 });
 list.Add(new Device() { Id = 202, Name = "6号测试设备", Type = "测试设备", Result = 89 });
 list.Add(new Device() { Id = 203, Name = "7号测试设备", Type = "测试设备", Result = 98 });
 list.Add(new Device() { Id = 204, Name = "8号测试设备", Type = "测试设备", Result = 95 });

Select

Select 方法用于将集合中的每个元素转换成另一种形式。它接受一个 lambda 表达式,该表达式定义了如何转换每个元素。Select 返回的是一个序列,通常用于项目映射或投影。

使用场景

  • 当你需要对集合中的每个元素应用一个转换,并且不需要立即执行这个转换时(即延迟执行)。
  • 当你希望返回一个集合而不是具体的集合类型(如列表或数组)。

示例

在这个例子中,Selectdevices 列表中的每个 Device 对象转换为其 Name 属性,返回一个只包含名字的序列。


  // 使用 Select 映射 Devices 中的每个 Device 对象到其 Name 属性
  var deviceNames = list.Select(x => x.Name);
  var deviceIds = list.Select(x => x.Id);
  //转换到一个新的类型
  var dtos = list.Select(x => new DeviceDto { Id = x.Id, Result = x.Result });

x=> x.Name该方法等价于一个带返回值的类型

string GetNane(Device device)
{
      return device.Name;
}

Select 的结果,集合泛型的类型,决定于返回的类型。

如下示例,返回不同类型对应集合类型也随着变化,但是集合的类型都是IEnumerable

  var deviceNames = list.Select(x => x.Name);
  var deviceIds = list.Select(x => x.Id);

  var dtos = list.Select(x => new DeviceDto { Id = x.Id, Result = x.Result });

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

ToList

ToList 方法将查询结果转换为 List<T>。它会在内存中立即执行查询,并返回一个列表。

使用场景

  • 当你需要一个具体类型的集合(如列表),并且希望立即执行查询时。如上所示,当我们使用Select或者其他方法,如Where等集合操作时,返回类型如果是集合类型,都会返回IEnumerable,他只提供了集合的基本操作,和相关的查询扩展方法,需要其他操作,如增加,删除, 就需要转换到List类型

示例

using System;
using System.Collections.Generic;
using System.Linq;

public class Device
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Program
{
    public static void Main()
    {
        List<Device> devices = new List<Device>
        {
            new Device { Id = 1, Name = "设备 1" },
            new Device { Id = 2, Name = "设备 2" }
        };

        // 使用 ToList 将 Devices 转换为 List<string>
        var namesList = devices.Select(device => device.Name).ToList();

        // 输出每个设备的名字
        foreach (var name in namesList)
        {
            Console.WriteLine(name);
        }
    }
}

在这里插入图片描述

在这个例子中,ToListSelect 的结果转换为一个列表,这意味着查询会被立即执行,并且你可以对列表进行修改。

使用场景2

foreach循环复制副本

在使用foreach时,我们无法对集合进行添加删除操作,如下所示,这样就会报错
在这里插入图片描述

此时,使用ToList()就可以创建一个集合的副本,再对原集合进行操作,就能正常操作了。同理**ToArray**也可以使用

 foreach (var item in list.ToList())
 {
     list.Remove(item);
     Console.WriteLine("已删除:" + item.Name);
 }

在这里插入图片描述

ToArray

ToArray 方法将查询结果转换为 T[]。它也会在内存中立即执行查询,并返回一个数组。

ToArray用法跟ToList基本相同,只不过返回的是一个数组,这个就看具体的使用需求了,如果对应参数需要是数组就使用这个。

使用场景

  • 当你需要一个数组时,数组在大小上是不可变的,适合于固定大小的集合。
  • 当你需要将结果传递给接受数组的方法时。

示例

using System;
using System.Collections.Generic;
using System.Linq;

public class Device
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Program
{
    public static void Main()
    {
        List<Device> devices = new List<Device>
        {
            new Device { Id = 1, Name = "设备 1" },
            new Device { Id = 2, Name = "设备 2" }
        };

        // 使用 ToArray 将 Devices 转换为 string[]
        var namesArray = devices.Select(device => device.Name).ToArray();

        // 输出每个设备的名字
        foreach (var name in namesArray)
        {
            Console.WriteLine(name);
        }
    }
}

在这个例子中,ToArraySelect 的结果转换为一个数组,这意味着查询会被立即执行。

总结

总结来说,Select 用于转换集合里面对象的类型,从一个类型转变到另一个类型

ToListToArray 主要用于集合类型转换,一般查询方法返回IEnumerable类型,需要这两个方法转换到对应可操作的集合,这两个方法一般是配合其他方法使用,当然也可以用于List与数组互相转换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/717006.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学周刊杂志学周刊杂志社学周刊编辑部2024年第19期目录

热点关注 “一带一路”背景下高校创新创业教育的机遇、挑战与发展对策 温玲子; 1-4 高职院校创新创业教育模式的实践研究 杜卉; 5-8 谈高职医学院校计算机教学中学生创新创业能力培养 王磊; 9-12 教改新论《学周刊》投稿&#xff1a;cn7kantougao163.com 大数据…

实战 | 基于YOLOv10的车辆追踪与测速实战【附源码+步骤详解】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

音频文件下载后,如何轻松转换格式?

在我们日常的数字生活中&#xff0c;下载各种音频文件是司空见惯的事情。然而&#xff0c;有时候我们可能需要将这些音频文件转换为不同的格式&#xff0c;以适应不同的设备或编辑需求。无论您是希望将下载的音频文件转换为通用的MP3格式&#xff0c;还是需要将其转换为高保真的…

eNSP学习——OSPF在帧中继网络中的配置

目录 主要命令 原理概述 实验目的 实验场景 实验拓扑 实验编址 实验步骤 1、基本配置 2、在帧中继上搭建OSPF网络 主要命令 //检查帧中继的虚电路状态 display fr pvc-info//检查帧中继的映射表 display fr map-info//手工指定OSPF邻居,采用单播方式发送报文 [R1]os…

Scala入门【安装与使用、变量与数据类型、运算符、函数、条件判断、循环、字符串、面向对象、数组】

视频地址:Scala大专/本科专用课程_哔哩哔哩_bilibili 目录 P01【01Scala安装与使用】16:15 P02【02变量与数据类型】17:14 P03【03运算符】12:41 P04【04函数】16:40 P05【05条件判断】10:56 P06【06循环】13:33 P07【07字符串】19:09 P08【08面向对象】17:27 P09【0…

栅格数据实现最优参数地理探测器(OPGD)详细教程!(上)

数据准备 要探寻一堆因素对因变量的影响,首先你要确定要用哪些自变量来影响哪个因变量 想好了之后 你需要到相应的网站去下载你的研究区的自变量和因变量数据的栅格数据(可以是离散的,也可以是连续的) 后续操作是到Arcgis里对你的数据处理一下 由于不是教程的重点,这里就…

电脑微信聊天记录监控要怎么做?找谁找?

电脑微信聊天记录的监控通常涉及到使用特定的监控软件&#xff0c;这些软件设计用于企业管理和网络监控&#xff0c;以确保工作场所的通信安全和提高工作效率。以下是进行电脑微信聊天记录监控的一般步骤和建议&#xff1a; 如何进行监控&#xff1a; 1.明确目的与合法性&…

滑动窗口(LeeCode209题,以JS为例)

什么是滑动窗口&#xff1f; 滑动窗口是算法中一种非常有用的技术&#xff0c;特别是在处理数据序列或数组时。它的核心思想是维护一个固定大小的窗口&#xff0c;这个窗口在数据序列上滑动&#xff0c;以便于在窗口内的元素上进行操作或计算。滑动窗口技术通常用于解决与数据…

2024年粤港澳青少年信息学创新大赛图形化编程小低组真题试卷

2024年粤港澳青少年信息学创新大赛图形化编程小低组真题试卷 题目总数&#xff1a;16 总分数&#xff1a;100 单选题 第 1 题 单选题 默认小猫角色&#xff0c;以下哪个Scratch程序可以在点击绿旗后让小猫说”你好!"一共10秒? A. B. C. D. 第 2 题 单选题 …

如何根据使用场景选购3D扫描仪?

三维扫描建模是指通过专业的三维扫描仪对产品进行三维数据的采集&#xff0c;快速获取物体精确的3D数据&#xff0c;实现1:1复刻原物体&#xff0c;扫描后所得的数字化3D模型以obj、fbx、glb、gltf等格式保存。 积木易搭自主研发多款三维扫描设备&#xff0c;拥有多项国家专利&…

[240617] RFC 9562-UUIDs,取代原来的 RFC 4122 | ChatGPT 导致线上自由职业者的需求大幅下降

目录 RFC 9562 - UUIDs - 2405发布&#xff0c;取代原来的 RFC 4122ChatGPT 导致线上自由职业者的需求大幅下降 RFC 9562 - UUIDs - 2405发布&#xff0c;取代原来的 RFC 4122 这份 RFC 中包含了 UUID 八个版本的 定义&#xff0c;但看点是在新引入 v6, v7, v8 详细标准文本可…

剧本杀小程序开发,线上剧本杀游戏新体验

近几年&#xff0c;剧本杀行业快速崛起&#xff0c;吸引了广大年轻人的眼光&#xff0c;成为年轻人社交娱乐的新选择。剧本杀在线上也崭露头角&#xff0c;获得大众的关注&#xff0c;性价比高的优势成为了大众玩剧本杀的首要方式。 随着互联网的快速发展&#xff0c;年轻人都…

windows11子系统Ubuntu 22.04.4子安装图形化界面

1、windows11家庭版本设置 打开虚拟机安装许可 2、Microsoft Store下载安装ubuntu 我使用的是22.04.4 LTS版本 3、 打开ubuntu 命令窗口 1、打开win11的命令行&#xff0c;在下拉三角下标&#xff0c;打开&#xff0c;可以看到有Ubuntu 的选项&#xff0c;点击即可进入linux命…

网络层只懂路由?这9个知识点被严重低估了

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 网络层想必你已经耳熟能详&#xff0c;它的作用自然是不容小觑。 它负责将数据从源头准确地投递到目的地&am…

【大语言模型】本地快速部署Ollama运行大语言模型详细流程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【源码】Spring事务之事务失效及原理

Spring事务 1、【源码】SpringBoot事务注册原理 2、【源码】Spring Data JPA原理解析之事务注册原理 3、【源码】Spring Data JPA原理解析之事务执行原理 4、【源码】SpringBoot编程式事务使用及执行原理 5、【源码】Spring事务之传播特性的详解 6、【源码】Spring事务之…

怎么将经典动漫秒变高清动漫?

你的记忆中是否也有一部经典的动漫、动画片。那是我们童年的美好记忆&#xff0c;但是我们现在如果再去重温时往往会因为太模糊而看不下去&#xff0c;那么我们有什么好的办法可以修复动漫的清晰度呢&#xff1f;一起来看看吧&#xff01; 不管是修复动画片&#xff0c;还是修复…

SelfGNN: Self-Supervised Graph Neural Networks for Sequential Recommendation

SelfGNN: Self-Supervised Graph Neural Networks for Sequential Recommendation&#xff08;Sigir2024&#xff09; 摘要 顺序推荐通过对用户的时间和顺序交互模式进行建模&#xff0c;有效地解决信息过载问题。 为了克服监督信号的局限性&#xff0c;最近的方法在推荐系统中…

Hyper-V如何将文件复制到虚拟机?教您3个简单的方法!

需要将文件复制到虚拟机&#xff01; “大家好&#xff0c;有谁知道Hyper-V怎么将文件复制到虚拟机吗&#xff1f;我有一些文件&#xff0c;想要从主机中复制进虚拟机中&#xff0c;但是我不知道该怎么操作&#xff0c;有谁可以帮帮我吗&#xff1f;谢谢。” Hyper-V虚拟机可…

Vuex遇到浏览器刷新,store里存的数据还在吗?

我们在做Vue前端项目的时候&#xff0c;很可能会使用Vuex来做一些状态或者数据管理&#xff0c;希望在一定程度上&#xff0c;不发送网络请求&#xff0c;不经过密集的组件数据传输&#xff0c;也可以达到数据共享的目的。但如果浏览器页面刷新了&#xff0c;Vuex中store里存的…