【一文了解】C#基础-集合

目录

集合

1.集合分类

1.1.非泛型集合

1.2.泛型集合

1)列表(List)

2)字典(Dictionary)

3)队列(Queue)

4)栈(Stack)

5)哈希集合(HashSet)

2.集合的常见操作

3.区分泛型集合与非泛型集合

3.1.非泛型集合

1)优点

2)缺点

3.2.泛型集合

1)优点

2)缺点

总结


       本篇文章来学习一下集合,C#集合主要分为非泛型集合与泛型集合。

集合

       集合(Collection)是一种用于存储、管理和操作一组数据的容器或数据结构。在编程中,集合通常指的是能够存储多个元素的数据结构,它允许对元素进行各种操作,比如添加、删除、查找、排序、遍历等。集合可以是有序的,也可以是无序的,元素的类型可以是基本数据类型,也可以是对象。

       集合是一种数据结构,一种数据容器。集合大小可变,空间不一定连续;分为非泛型集合(ArrayList)、泛型集合(列表(List)、字典 (Dictionary)、栈 (Stack) 、队列 (Queue)、哈希集合(HashSet))

1.集合分类

1.1.非泛型集合

       非泛型集合使用object类型来存储所有元素,可以将任何类型的对象放入集合中,但在取出元素时需要进行强制类型转换,这可能导致InvalidCastException等运行时错误,有时候需要手动转换类型。它们存储的元素通常是object类型,因此可以存储任何类型的数据。常见的非泛型集合包括ArrayList、Hashtable、Queue、Stack等。使用命名空间System.Collections。

       特点:由于存储的元素是object类型,可能需要类型转换,运行时性能较差。

using System.Collections;
using UnityEngine;/// <summary>
/// ArrayList
/// </summary>
public class ArrayListTest
{private ArrayList list = new ArrayList();//非泛型集合private GameObject cube;private void Start(){list.Add(1);list.Add("张三");list.Add("李四");list.Add(cube);//判断集合中是否含有“张三”,并将“张三”移除if (list.Contains("张三"))list.Remove("张三");//从索引1位置插入“王五”元素list.Insert(1, "王五");//从索引0位置移除2个元素list.RemoveRange(0, 2);for (int i = 0; i < list.Count; i++){Debug.Log(list[i]);//有序输出}}
}

1.2.泛型集合

       泛型集合是通过使用泛型类型参数T来提供类型安全的集合类型。常见的泛型集合包括List<T>、Dictionary<TKey, TValue>、Queue<T>、Stack<T>、HashSet<T>等。使用命名空间System.Collections.Generic。

1)列表(List)

       List<T>是C#中最常用的集合类型之一,它是一个动态数组,允许在运行时添加、删除、修改元素,大小是可变的。

       特点:动态大小,可以在运行时动态增减元素;支持随机访问,可以通过索引访问列表中的元素。

using System.Collections.Generic;
using UnityEngine;/// <summary>
/// List<T>
/// </summary>  
public class ListTest
{private List<string> strList = new List<string>();//泛型集合(需指定类型)private List<int> intList = new List<int>() { 1, 10, 5, 100 };private void Start(){strList.Add("张三");strList.Add("李四");strList.Add("王五");strList.Add("赵六");strList.Remove("李四");foreach (var item in strList){Debug.Log(item + " ");}intList.Sort();foreach (var item in intList){Debug.Log(item + " ");}}
}

2)字典(Dictionary)

       Dictionary<TKey, TValue>是一个基于键-值对的集合,存储的每个元素都有一个唯一的键与对应的值。

       特点:键值对,每个元素都有一个唯一的键,值是与键相对应的数据;快速查找,通过键可以快速查找到对应的值。

using UnityEngine;
using System.Collections.Generic;/// <summary>
/// 字典(字典嵌套字典) Dictionary<TKey,TValue>
/// </summary>
public class DicTest : MonoBehaviour
{//主键   子键   值private Dictionary<string, Dictionary<string, string>> myDic= new Dictionary<string, Dictionary<string, string>>();private void Start(){//姓名 QQ 地址myDic.Add("张三", new Dictionary<string, string>());myDic["张三"].Add("QQ", "12345");myDic["张三"].Add("地址", "北京");print(myDic["张三"]["地址"]);//获取值}
}

3)队列(Queue)

       Queue<T>是一个先进先出(FIFO,First In First Out)的集合。它常用于实现排队的场景,比如任务调度、打印队列等。

       特点:先进先出,队列中的元素按照它们被添加的顺序处理;添加操作(Enqueue)向队列的末尾添加元素,移除操作(Dequeue)从队列的前端移除元素。

using UnityEngine;
using System.Collections;/// <summary>
/// 队列Queue (先进先出) Queue<T> 
/// </summary>
public class QueueTest : MonoBehaviour
{private Queue queue = new Queue();private void Start(){queue.Enqueue("入队");print(queue.Dequeue());//移除并读队首print(queue.Peek());//读取队首但不移除print(queue.Count);}
}

4)栈(Stack)

       Stack<T> 是一个后进先出(LIFO,Last In First Out)的集合。它用于管理临时数据,如递归操作、回退功能等。

       特点:后进先出,栈中的元素按照它们被添加的顺序的相反顺序被处理;添加操作(Push)将元素压入栈顶,移除操作(Pop)将栈顶元素弹出。

using UnityEngine;
using System.Collections;/// <summary>
/// 栈Stack (后进先出)  Stack<T>
/// </summary>
public class StackTest : MonoBehaviour
{/**主菜单->选项->游戏选项->难度调节->简单*逐层压栈,逐层弹栈,最后一个(主菜单),只读不弹*/private Stack stack = new Stack();private void Start(){//逐层压栈stack.Push("主菜单");stack.Push("选项");stack.Push("游戏选项");stack.Push("难度调节");stack.Push("简单");//逐层弹栈,读取用whilewhile (stack.Count > 1){print("弹栈 : " + stack.Pop());}print("只读不弹 : " + stack.Peek());}
}

5)哈希集合(HashSet)

       HashSet<T> 是一个无序的集合,它存储唯一的元素,不允许有重复元素。

       特点:无序,元素的顺序不是固定的;唯一性,不会允许添加重复的元素。

HashSet<int> uniqueNumbers = new HashSet<int> { 1, 2, 3, 4, 4 };//4会被去重

2.集合的常见操作

1)添加元素:大多数集合类型都提供Add或类似的方法来添加元素。

2)删除元素:可以通过Remove、RemoveAt或Dequeue等方法来删除元素。

3)查找元素:可以使用Contains、IndexOf或通过键在字典中查找元素。

4)遍历元素:大多数集合都支持通过foreach或索引来遍历其中的元素。

5)清空集合:有些集合提供了Clear方法,用于清空集合中的所有元素。

3.区分泛型集合与非泛型集合

3.1.非泛型集合

1)优点

①灵活性高:非泛型集合可以存储不同类型的数据,因为它们是基于object类型的。例如,一个ArrayList可以存储 int、string、double等不同类型的对象,对于动态数据类型处理很有用。

ArrayList list = new ArrayList();
list.Add(1);//添加int类型
list.Add("hello");//添加string类型
list.Add(3.14);//添加double类型

②向后兼容:非泛型集合是C#早期版本的标准,因此在一些老旧的代码库或库中,非泛型集合仍然被广泛使用。如果需要与旧版代码兼容,非泛型集合可能更方便。

③动态类型支持:非泛型集合对不同类型的数据支持更加灵活,适合动态类型的需求。例如,反射和序列化场景中,可能不清楚对象的确切类型时,使用object类型的集合会更方便。

2)缺点

①类型安全差:由于集合元素存储为object类型,因此无法保证集合中元素的类型一致性,所以必须在操作集合时进行类型检查和强制类型转换,以避免在运行时发生错误。

ArrayList list = new ArrayList();
list.Add(1);//存储int类型
list.Add("hello");//存储string类型//强制类型转换可能导致错误
int number = (int)list[1];//运行时错误:无法将string转换为int

②性能较差:由于元素存储为object类型,在访问时需要进行装箱(对于值类型)或类型转换。这些操作增加了运行时的开销,尤其是在处理大量数据时,性能会有所下降。

③无法直接使用LINQ:非泛型集合不直接支持LINQ查询。虽然可以将其转换为泛型集合来使用LINQ,但这样会增加额外的开销。

④维护难度大:如果集合中存储的元素类型不同,代码的可读性和维护性会变差。因此必须记住集合中包含哪些类型,避免发生类型转换错误。

3.2.泛型集合

1)优点

①类型安全:泛型集合允许在编译时指定元素类型,保证集合中的元素类型一致。这避免了运行时类型转换错误,提高了代码的安全性。如,List<int>只能存储int类型的元素,不会出现类型不匹配的错误。

List<int> numbers = new List<int>();
numbers.Add(1);
numbers.Add(2);
//numbers.Add("string");//编译时错误,不能将string添加到List<int>中

②性能优越:由于泛型集合在编译时确定元素类型,不需要进行类型转换或装箱操作,因此性能通常更好。对于值类型(如 int、struct等),没有装箱过程,因此可以避免额外的内存开销。

③可读性和维护性:泛型集合提高了代码的可读性和可维护性,因为明确知道集合中的元素类型,代码更加直观。

④支持LINQ查询:泛型集合与LINQ查询集成得很好,能够直接进行类型安全的查询和操作。

2)缺点

①类型限制:泛型集合要求指定集合元素的类型,这可能导致在一些动态类型的场景中,使用泛型集合不太方便。如在处理不同类型的对象时可能需要使用object类型(这就绕回到非泛型集合的做法)。

②开发复杂度:如果需要存储不同类型的数据,可以通过object类型的泛型集合来实现,但这可能导致类型转换的麻烦,降低了类型安全。

总结

1)泛型集合:当需要高性能、类型安全、并且处理明确类型的数据时,应该选择泛型集合。

2)非泛型集合:当需要处理不同类型的数据(如存储不同类型的对象)或者与旧版代码兼容时,选择非泛型集合。

特性泛型集合非泛型集合
类型安全

强制指定元素类型,编译时类型检查

使用Object类型,缺乏类型安全

性能

更高,避免装箱和类型转换

较低,需要装箱和类型转换

灵活性

只能存储指定类型的元素

可以存储任何类型的元素

开发复杂度

需要指定元素类型,适用于类型明确的场景

可存储不同类型的数据,适用于动态类型场景

兼容性

现代C#项目,广泛使用

向后兼容旧版C#代码,支持更动态的需求

支持 LINQ

支持LINQ查询

不直接支持LINQ查询

       泛型集合的类型更安全、性能更高,在C#的大多数开发中,更推荐使用泛型集合。而非泛型集合由于灵活性更高,适合存储多种类型的数据,但因类型安全差,性能较低,需谨慎使用。 

       好了,今天的分享到这里就结束啦,希望对你有所帮助~

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于Jeecgboot3.6.3vue3的flowable流程online表单的审批使用介绍

更多技术支持与服务请加入我的知识星球或加我微信&#xff0c;名称:亿事达nbcio技术交流社区https://t.zsxq.com/iPi8F 今天介绍一下基于jeecgboot3.6.3的flowable流程使用online表单进行审批的情况 1、首先建立一个online应用类型的流程&#xff0c;如下&#xff1a; 2、进行…

flink 内存配置(二):设置TaskManager内存

flink 内存配置&#xff08;一&#xff09;&#xff1a;设置Flink进程内存 flink 内存配置&#xff08;二&#xff09;&#xff1a;设置TaskManager内存 flink 内存配置&#xff08;三&#xff09;&#xff1a;设置JobManager内存 flink 内存配置&#xff08;四&#xff09;…

基于SpringBoot沉浸式戏曲文化体验系统【附源码】

基于SpringBoot沉浸式戏曲文化体验系统 效果如下&#xff1a; 系统主页面 系统登陆页面 用户管理页面 戏曲剧目管理页面 戏曲倾听页面 活动信息管理页面 个人中心页面 研究背景 随着互联网技术的飞速发展&#xff0c;传统文化传播方式正面临着前所未有的变革。戏曲作为我国传…

P3-1.【结构化程序设计】第一节——知识要点:算法、顺序结构程序设计、if语句的语法结构及各种用法

讲解视频&#xff1a; P3-1.【结构化程序设计】第一节——知识要点&#xff1a;算法、顺序结构程序设计、if语句的语法结构及各种用法 知识要点&#xff1a;算法、顺序结构程序设计、if语句的语法结构及各种用法 一、算法、顺序结构程序设计任务分析 知识要点&#xff1a;算法…

RAG三件套运行的新选择 - GPUStack

GPUStack 是一个开源的大模型即服务平台&#xff0c;可以高效整合并利用 Nvidia、Apple Metal、华为昇腾和摩尔线程等各种异构的 GPU/NPU 资源&#xff0c;提供本地私有部署大模型解决方案。 GPUStack 可以支持 RAG 系统中所需要的三种关键模型&#xff1a;Chat 对话模型&…

SSM物联网养殖管理系统-计算机毕业设计源码03998

目录 1 绪论 1.1 研究背景和意义 1.2国内外研究现状 1.3论文结构与章节安排 2 系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2经济可行性分析 2.1.3操作可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 系统流程分析…

使用Python进行健康监测和分析的案例研究

健康监测和分析是指系统地使用健康数据来跟踪和评估个人或人群在一段时间内的健康状况。它包含一系列活动&#xff0c;从实时生理数据收集&#xff08;如心率&#xff0c;血压和体温&#xff09;到分析更复杂的健康记录&#xff08;包括患者病史&#xff0c;生活方式选择和遗传…

RHCE 第四次作业

一.搭建dns服务器能够对自定义的正向或者反向域完成数据解析查询。 1.配置环境 [rootlocalhost ~]# yum install bind [rootlocalhost ~]#systemctl stop firewalld [rootlocalhost ~]#setenforce 0 2.配置DNS主服务器 [rootlocalhost ~]# vim /etc/named.conf options { …

打字机效果显示

文章目录 打字机效果显示一、效果图二、视频效果三、代码 打字机效果显示 一、效果图 二、视频效果 B站-打字机效果图 打字机效果 打字机效果 三、代码 框架&#xff1a; <div class"t_title"><span>我的能力</span> <!-- <span>使…

PyQt5实战——翻译的实现,成功爬取微软翻译(可长期使用)经验总结(九)

个人博客&#xff1a;苏三有春的博客 系类往期文章&#xff1a; PyQt5实战——多脚本集合包&#xff0c;前言与环境配置&#xff08;一&#xff09; PyQt5实战——多脚本集合包&#xff0c;UI以及工程布局&#xff08;二&#xff09; PyQt5实战——多脚本集合包&#xff0c;程序…

[含文档+PPT+源码等]精品基于Nodejs实现的物流管理系统的设计与实现

基于Node.js实现的物流管理系统的设计与实现背景&#xff0c;主要源于物流行业的快速发展以及信息技术在物流管理中的广泛应用。以下是对该背景的具体阐述&#xff1a; 一、物流行业的快速发展 随着全球经济一体化的加速和电子商务的蓬勃发展&#xff0c;物流行业作为连接生产…

JavaWeb开发9

ResponseBody 类型&#xff1a;方法注解、类注解 位置&#xff1a;Controller方法上/类上 作用&#xff1a;将方法返回值直接响应&#xff0c;如果返回值类型是实体对象/集合&#xff0c;将会转换为JSON格式响应 说明&#xff1a;RestControllerControllerResponseBody; 统…

直播美颜SDK开发指南:实时美颜技术的架构与优化策略

时下&#xff0c;为了满足市场需求&#xff0c;许多企业开始开发自己的美颜SDK&#xff0c;通过集成到直播或视频应用中&#xff0c;实现实时美颜效果。接下来&#xff0c;笔者将从美颜SDK的架构设计和优化策略出发&#xff0c;深入探讨如何打造一个智能化的视频美颜平台。 一…

Leecode热题100-104.二叉树中的最大路径和

二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root &#xff0c…

第六十三周周报 GCN-CNNGA

文章目录 week 63 GCN-CNNGA摘要Abstract1. 题目2. Abstract3. 文献解读3.1 Introduction3.2 创新点 4. 网络结构4.1 数据分析4.2 混合深度学习框架的发展4.3 Mul4.4 CNN block4.5 GCN block4.6 GRU block4.7 注意力机制4.8 模型评估标准 5. 实验结果5.1 不同邻接矩阵的性能评价…

学习笔记——MathType公式编号:右编号和随章节变化

1.如何在word文档中插入带有编号的公式&#xff1f; 步骤&#xff1a;(前提是已经安装mathtype) 2.MathType公式编号怎么随章节变化&#xff1f; 想要编号级数也随标题级数进行自动变化&#xff0c;则需要插入或修改文档的“分隔符” 步骤&#xff1a;

VS+QT开发 找不到宏$(Qt_INCLUDEPATH_) $(Qt_LIBS_)

问题&#xff1a;在VSQT开发环境&#xff0c;项目右键->属性->C/C->常规->附加包含目录->宏&#xff08;位置在右下角&#xff09;->右侧新弹出的属性框内搜索Qt_INCLUDEPATH_ 找不到的场景的解决办法。

STl学习-迭代器

1.迭代器种类 这五种迭代器的声明如下&#xff1a; truct output_iterator_tag {};//输出迭代器 truct input_iterator_tag{ };//输入迭代器 truct forward iterator tag : public input iterator tag {};//向前迭代器 truct bidirectional iterator tag :public forward iter…

亲测在Windows系统安装、使用、定制Ollama服务

一、前言 1.1 Ollama介绍 Ollama是一个专为在本地环境中运行和定制大型语言模型而设计的工具。它提供了一个简单而高效的接口&#xff0c;用于创建、运行和管理这些模型&#xff0c;同时还提供了一个丰富的预构建模型库&#xff0c;可以轻松集成到各种应用程序中。Ollama的目标…

aLoNg3x.2 | CrackMe

cm下载链接&#xff1a; https://n0zom1z0.lanzoup.com/iB4Gz2el88cb 密码:38sy crack目标是让register框去掉。不让patch&#xff0c;所以要真算出Code。 第一个难点&#xff1a; DELPHI。。。窗口文字与处理函数的定义在这种地方&#xff1a; 这个cancel处&#xff0c;只要…