C# 泛型List相关用法以及与ArrayList和数组三者的区别

2023-10-27

数组

首先在C#也是存在数组的,用法如下:

一维:

string[] s=new string[2];  

s[0]="a";  

s[1]="b"; 

s[0]="c"; //修改

二维:

string[,] arr = new string[3, 5]  //表示三行五列的二维数组。

  {
                 {"1","1","1","1","1"},
                 {"1","1","1","1","1"},
                 {"1","1","1","1","1"}
  };

但是数组存在一些不足的地方。

  1. 在数组的两个数据间插入数据是很麻烦的。
  2. 在声明数组的时候必须指定数组的长度,数组的长度过长,会造成内存浪费,过段会造成数据溢出的错误。

针对数组的这些缺点,C#中最先提供了ArrayList对象来克服这些缺点。

 

ArrayList

ArrayList是命名空间System.Collections下的一部分,在使用该类时必须进行引用,同时继承了IList接口,提供了数据存储和检索。ArrayList对象的大小是按照其中存储的数据来动态扩充与收缩的。所以,在声明ArrayList对象时并不需要指定它的长度。

//ArrayList
ArrayList list1 = new ArrayList();
 
//新增数据
list1.Add("cde");
list1.Add(5678);
 
//修改数据
list[2] = 34;
 
//移除数据;注意,这里是RemoveAt()才是删除下标,并不是Remove
list.RemoveAt(0);
 
//插入数据
list.Insert(0, "qwe");

我们从上面的例子看,在List中,我们不仅插入了字符串cde,而且插入了数字5678。这样在ArrayList中插入不同类型的数据是允许的。因为ArrayList会把所有插入其中的数据当作为object类型来处理,在我们使用ArrayList处理数据时,很可能会报类型不匹配的错误,也就是ArrayList不是类型安全的。在存储或检索值类型时通常发生装箱和取消装箱操作,带来很大的性能耗损。

装箱与拆箱的概念(简单的说):
    装箱:就是将值类型的数据打包到引用类型的实例中,即自动将基本数据类型转换为包装器类型
    如下:

int  i="123";
object obj=(object)i;

 

拆箱:就是从引用数据中提取值类型
    

object obj="123";
int i=(int)obj;

装箱与拆箱的过程是很损耗性能的。 所以引进了List

 

泛型List

因为ArrayList存在不安全类型与装箱拆箱的缺点,所以出现了泛型的概念。List类是ArrayList类的泛型等效类,它的大部分用法都与ArrayList相似,因为List类也继承了IList接口。最关键的区别在于,在声明List集合时,我们同时需要为其声明List集合内数据的对象类型。

List<string> list = new List<string>();
 
//新增数据
list.Add(“abc”);
 
//修改数据
list[0] = “def”;
 
//移除数据
list.RemoveAt(0);

//泛型的长度(注意不是下标,最大的下标需要减1)
int Listlength  = list.Count;

上例中,如果我们往List集合中插入int数组123,IDE就会报错,且不能通过编译。这样就避免了前面讲的类型安全问题与装箱拆箱的性能问题了。

总结:
    数组的容量是固定的,您只能一次获取或设置一个元素的值,而ArrayList或List<T>的容量可根据需要自动扩充、修改、删除或插入数据。

    数组可以具有多个维度,而 ArrayList或 List< T> 始终只具有一个维度。但是,您可以轻松创建数组列表或列表的列表。特定类型(Object 除外)的数组 的性能优于 ArrayList的性能。 这是因为 ArrayList的元素属于 Object 类型;所以在存储或检索值类型时通常发生装箱和取消装箱操作。不过,在不需要重新分配时(即最初的容量十分接近列表的最大容量),List< T> 的性能与同类型的数组十分相近。

    在决定使用 List<T> 还是使用ArrayList 类(两者具有类似的功能)时,记住List<T> 类在大多数情况下执行得更好并且是类型安全的。如果对List< T> 类的类型T 使用引用类型,则两个类的行为是完全相同的。但是,如果对类型T使用值类型,则需要考虑实现和装箱问题。
 

原文:https://blog.csdn.net/zhang_xinxiu/article/details/8657431 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 泛型List相关用法以及与ArrayList和数组三者的区别 的相关文章

  • 是否有与 posix_memalign 对应的 C++ 版本?

    当我打电话时posix memalign http man7 org linux man pages man3 posix memalign 3 html为类型的对象分配对齐的内存Foo在我的 C 代码中 我需要做一个reinterpret
  • 使用 lambda 表达式注册类型

    我想知道如何在 UnityContainer 中实现这样的功能 container RegisterType
  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • 以编程方式读取 SQL Server 查询计划建议的 SQL 特定执行的索引?

    如果我在 SSMS 中运行此命令 set showplan xml on GO exec some procedure arg1 arg2 arg3 GO set showplan xml off GO 我获得查询执行中涉及的完整调用堆栈的
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • nvcc 编译并行程序时报错gcc: error trying to exec ‘cc1plus‘: execvp: 没有那个文件或目录

    一 nvcc 编译程序时报错 gcc error trying to exec cc1plus execvp 没有那个文件或目录 cc1plus 是gcc编译工具链中用到的一个程序 报错非常直白 就是说gcc在执行时找不到这个程序 二 问题
  • 北京航空航天计算机考研科目,2020考研北京航空航天大学计算机考研考试科目...

    2020考研 名校一直是考研学子的首选 北京航空航天大学作为全国名校 也是深受考研学子热衷追捧 那么下面启航小编就来介绍一下 2020考研 北京航空航天大学计算机考研科目 的相关内容 供考研学子参考 一起来了解一下吧 1 北京航空航天大学计
  • vue-admin 详细注释,必须手把手做项目系列之(二)

    文章将会自动保存至草稿 更新 麻雀虽小五脏俱全 项目地址 https github com whylisa vue admin step by step git 前言 这两天项目上线楼主要一大推的事要忙 要和产品撕逼 要和后台讨论一系列的问
  • selenium面试题

    今天有同学问到seleinum面试的时候会问到的问题 随便想了想 暂时纪录一下 欢迎大家在评论中提供更多问题 回复是我自己的答案 如果大家有什么好的看法 可以留言交流 去哪儿的面试题 selenium中如何判断元素是否存在 selenium
  • 【C++】 探索程序 详细解读程序在运行过程中都发生了什么

    目录 头文件 源代码 头文件重复包含 问题 解决方案 程序生成过程 预处理Preprocessi 编译Compilation 汇编Assembly 链接Linking 编译期 运行期 编译期确定 运行期确定 编译期错误 运行期错误 类和对象
  • 解决某些软件无法在parallels desktop虚拟机下运行

    步骤1 打开注册表 点开始菜单 点运行 输入regedit exe后回车 步骤2 找到HKEY LOCAL MACHINE HARDWARE DESCRIPTION System 步骤3 找到右边的VideoBiosVersion 双击打开
  • 【计算机视觉

    文章目录 一 Precision Recall 和 F1 score 二 IoU 三 mAP 四 AP 4 1 定义 4 2 分类 4 2 1 APs 4 2 2 APr 4 2 3 两者之间的区别 一 Precision Recall 和
  • Linux Shell 常用命令总结

    1 find find pathname options print exec ok 让我们来看看该命令的参数 pathname find 命令所查找的目录路径 例如用 来表示当前目录 用 来表示系统根目录 print find 命令将匹配
  • ipad编写html,iPad HTML Focus

    Sorry folks I guess I have to bring you a bad news So much questions for HOW DO I FOCUS ON AN INPUT FIELD ON IPAD USING
  • c51两个定时器中断冲突_单片机学习day11—中断系统(外部中断 & 定时器/计数器)...

    51单片机的中断系统 非常非常非常重要 一 中断的概念 CPU在处理某一事件A时 发生了另一事件B请求CPU迅速去处理 中断发生 CPU暂时中断当前的工作 转去处理事件B 中断响应和中断服务 待CPU将事件B处理完毕后 再回到原来事件A被中
  • 蓝桥杯 算法训练 乘积最大Python实现(动态规划)详细

    资源限制 时间限制 1 0s 内存限制 256 0MB 问题描述 今年是国际数学联盟确定的 2000 世界数学年 又恰逢我国著名数学家华罗庚先生诞辰90周年 在华罗庚先生的家乡江苏金坛 组织了一场别开生面的数学智力竞赛的活动 你的一个好朋友
  • WPF应用无法从任务栏恢复(唤起)

    背景 两个window 一个在前 小屏播放视频 一个在后 全屏播放视频 点击切换按钮 两个window中的内容对调 当点击任意window上面的缩小按钮的时候 将所有的window的 windowState 设置为 minimized 期望
  • 数据结构—快速掌握如何手动求解关键路径

    看到一道题 分析如何手动求解关键路径 文末有题目出处 如上图 红点表示状态 边表示活动及其所需要的时间 这是用箭线表示活动 节点表示事件的一种网络图绘制方法 也称为双代号网络图 AOA 下面我们将利用其它快捷方法求出关键路径 方法一 逆推法
  • 美国国家安全局(NSA)网络攻击主战武器“酸狐狸”

    近日 国家计算机病毒应急处理中心对美国家安全局 NSA 酸狐狸 漏洞攻击武器平台 FoxAcid 进行了技术分析 该漏洞攻击武器平台是美国国家安全局 NSA 特定入侵行动办公室 TAO 也被称为 接入技术行动处 对他国开展网络间谍行动的重要
  • 乐高编程学c语言吗,乐高编程和少儿编程的区别

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 乐高编程和少儿编程的区别如下 1 乐高编程是以调用编程模块指令让机器动起来为目的 通常需要编程的模块是已经写好存储在模块里的 学员做的只是将模块以不同的方式拼接组合起来 2
  • DataGridView控件常用属性

    DataGridView控件常用属性 1 AllowUserToAddRow 去掉最后一行添加行的选项 2 RowHeadersVisble 去掉第一列包含行标题的列 3 AutoSizeColumnsMode 可见列的自动调整大小 4 S
  • C++ 预处理器

    预处理器是一些指令 指示编译器在实际编译之前所需完成的预处理 所有的预处理器指令都是以井号 开头 只有空格字符可以出现在预处理指令之前 例如 include 指令 这个宏用于把头文件包含到源文件中 C 还支持很多预处理指令 比如 inclu
  • 关系型数据库和NoSQL数据库探讨

    在当今数据时代 数据量持续增长 数据种类不断增加 使得传统关系型数据库面临了很大的挑战 为了解决这些问题 新型数据库技术也应运而生 同传统关系型数据库进行对比 就可以更好地了解其优点和局限性 1 传统关系型数据库的弊端 在传统关系型数据库中
  • 怎么用Python实现微信自动回复,一文看懂

    都什么年代了 不会还有人用itchat吧 itchat早就寄了 在网上搜用Python实现微信自动回复的 搜来搜去全是用itchat 一运行全都不行 无奈只能自己用别的库实现 根据预定的csv数据自动回复 import numpy as n
  • C# 泛型List相关用法以及与ArrayList和数组三者的区别

    数组 首先在C 也是存在数组的 用法如下 一维 string s new string 2 s 0 a s 1 b s 0 c 修改 二维 string arr new string 3 5 表示三行五列的二维数组 1 1 1 1 1 1