详细介绍:C#中常见集合都有哪些?

news/2026/1/19 19:23:10/文章来源:https://www.cnblogs.com/gccbuaa/p/19503517

文章目录

  • 为什么得集合
  • 核心操作
    • **底层数据结构**
  • **主要命名空间**
  • **C# 集合的分类**
    • **按泛型支持分类**
      • **非泛型集合 (Non-Generic Collections)**
      • **泛型集合 (Generic Collections)**
    • **按可变性分类**
      • **可变集合 (Mutable Collections)**
      • **不可变集合 (Immutable Collections)**
    • **按线程安全性分类**
      • **非线程安全集合 (Non-Thread-Safe Collections)**
      • **线程安全集合 (Thread-Safe Collections)**
    • **按访问方式和结构分类**
      • **索引集合 (Indexed Collections)**
      • **键控集合 (Keyed/Associative Collections)**
      • **集合/集 (Set-Based Collections)**
      • **顺序访问集合 (Sequential Access - FIFO/LIFO)**
    • **按接口实现分类**
  • 常见集合
      • **ArrayList (System.Collections)**
      • **Hashtable (System.Collections)**
      • **List<T> (System.Collections.Generic)**
      • **Dictionary<TKey, TValue> (System.Collections.Generic)**
      • **HashSet<T> (System.Collections.Generic)**

集合的概念

在 C#(以及许多其他编程语言)中,集合 是一个用来存储和管理一组其他对象(称为元素或项)的容器对象。

简单来说,当你要求处理多个相关的数据项时,将它们放入一个集合中通常比为每个项创建单独的变量更方便、更有效。想象一下你得存储一个班级所有学生的名字,或者一个购物车里所有商品的列表,应用集合就非常合适。

为什么需要集合

  1. 数据分组:将逻辑上相关的项组织在一起。
  2. 动态大小: 大多数集合类型的大小不是固定的(与数组 T[] 不同),它们可以根据需要动态地增加或减少容量来容纳更多或更少的元素。
  3. 高效操作:集合提供了优化过的方法来执行常见执行,如添加 (Add)、移除 (Remove)、查找 (Find/Contains)、排序 (Sort) 等。其效率取决于集合的具体类型及其底层数据结构。
  4. 统一管理:通过集合对象统一管理一组数据,简化代码逻辑。
  5. 迭代: 提供标准的机制(如 foreach 循环)来遍历集合中的所有元素。

核心操作

大多数集合都支持一些基本操作,例如:

底层数据结构

C# 中的集合类是常见数据结构(如动态数组、链表、哈希表、树等)的具体实现。选择哪种集合类型通常取决于你对性能(特定操作的速度)、内存使用、元素顺序、元素唯一性等方面的要求。

主要命名空间

C# 集合相关的类主要分布在以下几个命名空间:

C# 集合的分类

C# 中的集合许可从多个维度进行分类,理解这些分类有助于选择最适合特定场景的集合类型。

按泛型支持分类

最重要的分类。就是这是最基本也

非泛型集合 (Non-Generic Collections)

命名空间:System.Collections

  • **特点:**可以存储任意类型的对象 (System.Object)。
  • 类型不安全:在添加元素时,所有类型都被视为 object;在检索元素时,通常需要进行显式类型转换(拆箱/Casting),如果在运行时类型不匹配,会抛出 InvalidCastException
  • 性能开销:当存储值类型(如 int, struct)时,会发生装箱(Boxing,将值类型转换为对象类型)和拆箱(Unboxing,将对象类型转换回值类型)操作,这会带来额外的内存分配和 CPU 开销。
  • 代表:ArrayList, Hashtable, Queue, Stack, SortedList.
  • 现状:在现代 C# 开发中已不推荐使用,主要用于维护旧代码或与不支持泛型的旧 API 交互。

泛型集合 (Generic Collections)

命名空间:System.Collections.Generic (及其他如 Concurrent, Immutable 等)

按可变性分类

可变集合 (Mutable Collections)

不可变集合 (Immutable Collections)

命名空间:System.Collections.Immutable

  • 特点: 一旦创建,集合实例的内容就不能更改。任何尝试“修改”的操作(如 Add, Remove)都会返回一个包含更改后的集合实例,原始实例保持不变。
  • 优点:线程安全(多线程读取安全),易于推理(状态不会意外改变),适合函数式编程。
  • 例子:ImmutableList<T>, ImmutableDictionary<TKey, TValue>, ImmutableHashSet<T>.

按线程安全性分类

非线程安全集合 (Non-Thread-Safe Collections)

  • 特点: 设计用于单线程环境。在没有外部同步机制(如 lock)的情况下,从多个线程并发访问(特别是写入操作)是不安全的,可能导致数据竞争、状态不一致或异常。
  • 例子:List<T>, Dictionary<TKey, TValue>, HashSet<T>, ArrayList, Hashtable, Queue<T>, Stack<T> 等标准集合。

线程安全集合 (Thread-Safe Collections)

按访问方式和结构分类

索引集合 (Indexed Collections)

键控集合 (Keyed/Associative Collections)

  • 特点:借助唯一的键来快速查找、添加、删除关联的值。
  • 例子:Dictionary<TKey, TValue>, Hashtable, ConcurrentDictionary<TKey, TValue>, SortedDictionary<TKey, TValue> (按键排序), SortedList<TKey, TValue> (按键排序)。

集合/集 (Set-Based Collections)

顺序访问集合 (Sequential Access - FIFO/LIFO)

  • 特点:元素的访问遵循特定顺序规则。
  • FIFO (先进先出):Queue<T>, ConcurrentQueue<T>.
  • LIFO (后进先出):Stack<T>, ConcurrentStack<T>.

按接口实现分类

集合类通常实现一个或多个接口,这些接口定义了它们的核心能力。了解这些接口有助于理解集合的能力契约:

常见集合

好的,我们来详细解析一下 C# 中 ArrayListHashSet<T>HashtableList<T>Dictionary<TKey, TValue> 这几个常用集合类的区别。

这些集合能够大致分为两类:

非泛型集合 (Non-Generic Collections)

通过位于 System.Collections 命名空间下,能够存储任意类型的对象(object)。

  1. ArrayList
  2. Hashtable

泛型集合 (Generic Collections)

位于 System.Collections.Generic 命名空间下,在创建时需要指定存储元素的具体类型,供应了类型安全和更好的性能。

  1. List<T>
  2. Dictionary<TKey, TValue>
  3. HashSet<T>
特性ArrayList (非泛型)Hashtable (非泛型)List (泛型)Dictionary<TKey, TValue> (泛型)HashSet (泛型)
命名空间System.CollectionsSystem.CollectionsSystem.Collections.GenericSystem.Collections.GenericSystem.Collections.Generic
类型安全否 (存储 object)否 (存储 object)是 (存储指定类型 T)是 (存储指定类型 TKey, TValue)是 (存储指定类型 T)
存储内容单个元素键值对 (object, object)单个元素 (T)键值对 (TKey, TValue)单个元素 (T)
内部结构动态数组哈希表动态数组哈希表哈希表
是否有序是 (按添加顺序)否 (无序)是 (按添加顺序)否 (基本无序)*否 (无序)
允许重复Key 不允许, Value 允许Key 不允许, Value 允许否 (元素唯一)
访问方式索引 (int)Key (object)索引 (int)Key (TKey)N/A (主要靠 Contains)
性能 (增/删/查)查(索引 O(1)), 增(摊销 O(1)), 删/包括(O(n))增/删/查(平均 O(1))查(索引 O(1)), 增(摊销 O(1)), 删/包含(O(n))增/删/查(平均 O(1))增/删/包含(平均 O(1))
主要用途存储有序对象列表 (已过时)存储键值对 (已过时)存储类型安全的有序列表存储类型安全的键值对 (快速查找)存储唯一元素, 快速判断存在性
  • 注意: Dictionary 在较新的 .NET 版本中,其内部实现可能在迭代时 碰巧保持插入顺序,但这并不是其设计保证的核心特性。不应依赖其顺序性。其核心优势在于基于 Key 的快捷查找。

ArrayList (System.Collections)

描述: 一个动态数组,可以存储任何类型的对象。它会根据应该自动调整大小。

优点通过: 灵活,能够存储不同类型的对象。

缺点:

  1. 类型不安全: 由于存储的是 object,存入和取出时可能需要进行类型转换(拆箱/装箱),容易在运行时引发 InvalidCastException。
  2. 性能: 对于值类型,存入时会发生装箱(Boxing),取出时需要拆箱(Unboxing),这会带来性能开销。查找特定元素(非按索引)通常得 O(n) 时间复杂度。

使用场景: 基本上已被 List 取代。只在需要与旧的、不协助泛型的 API 交互,或者极少数确实需要存储完全不同类型对象的场景下(但通常有更好的设计模式)才可能使用。

替代者: List

Hashtable (System.Collections)

描述: 一个基于哈希表的集合,用于存储键值对 (object Key, object Value)。借助 Key 快速查找 Value。

优点: 查找、添加、删除操作的平均时间复杂度接近 O(1)(假设哈希冲突不严重)。

缺点:

  1. 类型不安全 object,需要类型转换,有运行时错误风险。就是: Key 和 Value 都
  2. 性能: 同样存在值类型的装箱/拆箱问题。
  3. 无序: 元素的存储和迭代顺序是不确定的。
  4. 线程安全 (潜在挑战): 旧版本的 Hashtable 提供了某种程度的线程安全(通过内部锁),但这可能导致性能瓶颈。现代并发编程推荐使用 System.Collections.Concurrent 中的集合。

使用场景: 已被 Dictionary<TKey, TValue> 取代。理由同 ArrayList。

替代者: Dictionary<TKey, TValue>

List (System.Collections.Generic)

描述: 泛型版本的 ArrayList。在创建时必须指定要存储的元素类型 T

优点:

  1. 类型安全: 编译器会在编译时检查类型,避免了运行时的类型转换错误。
  2. 性能: 对于值类型,避免了装箱/拆箱的开销,性能通常优于 ArrayList
  3. 有序: 保持元素的插入顺序。
  4. 索引访问: 允许通过整数索引快速访问元素 (O(1))。

缺点:

  1. 查找/包含: Contains() 手段和按值删除 Remove() 通常必须遍历列表,时间复杂度为 O(n)。
  2. 插入/删除 (中间)摊销 O(1)。就是: 在列表的开头或中间插入/删除元素需移动后续元素,时间复杂度为 O(n)。在末尾添加通常

使用场景: 最常用的集合之一。当你应该一个有序的、可凭借索引访问的、类型安全的元素列表时使用。

Dictionary<TKey, TValue> (System.Collections.Generic)

描述: 泛型版本的 Hashtable。存储类型安全的键值对 (TKey, TValue)。

优点:

  1. 类型安全: 编译时进行类型检查。
  2. 性能: 避免了装箱/拆箱。基于 Key 的查找、添加、删除操作平均时间复杂度接近 O(1)。
  3. Key 唯一: 保证了 Key 的唯一性。

缺点:

  1. 无序: 通常不保证元素的顺序(虽然新版本实现可能有顺序性,但不应依赖)。
  2. 内存: 相较于 List<T>,可能占用稍多内存,因为它需要存储哈希表结构。

使用场景: 当你得根据一个唯一的标识符(Key)来飞快查找、添加或删除一个关联的值(Value)时启用。例如,用用户 ID 查找用户信息。

HashSet (System.Collections.Generic)

描述: 一个包含不重复元素的无序集合。基于哈希表构建。

优点:

  1. 唯一性: 自动处理重复元素,集合中只包含唯一的元素。
  2. 高性能查找: Contains() 方法(检查元素是否存在)、Add()Remove() 的平均时间复杂度接近 O(1)。
  3. 集合运算: 提供了高效的集合操控,如并集 (Union)、交集 (Intersect)、差集 (Except) 等。
  4. 类型安全: 泛型保证类型安全。

缺点:

  1. 无序: 不保证元素的任何特定顺序。
  2. 无索引访问: 不能经过索引访问元素。

使用场景: 当你需要存储一组唯一的元素,并且核心关心的是敏捷判断某个元素是否存在,或者进行集合运算时使用。例如,去除列表中的重复项,或者检查一个元素是否已处理过。

总结与建议

根据需求选择:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

职场必备!ima知识库+AI,让你的收藏夹变成生产力神器

文章介绍了ima知识库工具&#xff0c;通过AI技术重新定义知识的收集、管理、应用和分享。用户可多渠道收集信息&#xff0c;AI自动整理生成摘要&#xff0c;智能问答辅助决策创作&#xff0c;支持团队协作共享。文章提供了PC端和手机端的使用技巧&#xff0c;帮助用户建立标签体…

网络安全毕设简单的项目选题思路

0 选题推荐 - 云计算篇 毕业设计是大家学习生涯的最重要的里程碑&#xff0c;它不仅是对四年所学知识的综合运用&#xff0c;更是展示个人技术能力和创新思维的重要过程。选择一个合适的毕业设计题目至关重要&#xff0c;它应该既能体现你的专业能力&#xff0c;又能满足实际应…

收藏!AI替代IT团队?资深技术人深度解析行业变革与未来出路

AI技术崛起导致全球IT行业裁员潮&#xff0c;传统IT面临四重冲击&#xff1a;AI效率革命、企业战略转移、经济成本重构、人才需求转变。IT从业者需通过三条路径进化&#xff1a;能力重构从工具掌握到思维升级、定位转换从技术支持到价值创造、人机协作从替代焦虑到增强信心。不…

如何利用类似谷歌搜索文献的方式高效查找学术资源与研究资料

做科研的第一道坎&#xff0c;往往不是做实验&#xff0c;也不是写论文&#xff0c;而是——找文献。 很多新手科研小白会陷入一个怪圈&#xff1a;在知网、Google Scholar 上不断换关键词&#xff0c;结果要么信息过载&#xff0c;要么完全抓不到重点。今天分享几个长期使用的…

免费文献检索网站:实用资源推荐与高效使用指南

做科研的第一道坎&#xff0c;往往不是做实验&#xff0c;也不是写论文&#xff0c;而是——找文献。 很多新手科研小白会陷入一个怪圈&#xff1a;在知网、Google Scholar 上不断换关键词&#xff0c;结果要么信息过载&#xff0c;要么完全抓不到重点。今天分享几个长期使用的…

xactengine2_9.dll文件丢失找不到问题 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

【CSO MTSP】基于matlab自适应双种群协同鸡群算法ADPCCSO求解单仓库多旅行商问题【含Matlab源码 14998期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…

没有转化体系的物种,如何研究其基因功能?(四)

伯小远在“没有转化体系的物种&#xff0c;如何研究其基因功能&#xff08;一&#xff09;”中重点写了有稳定转化体系的物种的基因功能研究套路总结&#xff0c;在“&#xff08;二&#xff09;”中主要写了有哪些瞬时转化体系大家可以考虑使用&#xff0c;在“&#xff08;三…

当系统出现xactengine2_7.dll文件丢失找不到问题 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

【六翼旋翼机】六翼旋翼机运输悬挂有效载荷的建模与控制【含Matlab源码 15000期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab领域博客之家&#x1f49e;&…

Planning vs ReAct大对决:智能体架构终极指南,一篇收藏够用!附完整代码实现与性能评测

Planning架构是一种前瞻性决策的智能体设计模式&#xff0c;与ReAct"边走边看"不同&#xff0c;它先规划后执行。由Planner(规划)、Executor(执行)和Synthesizer(综合)三组件组成&#xff0c;遵循"接受任务→创建计划→执行计划→合成结果"流程。优点是结构…

AI Agent技术全景扫盲:从LLM到多智能体协作,一篇看懂核心概念

一、什么是AI Agent&#xff1f;AI Agent&#xff08;人工智能智能体&#xff09;是一个能够感知环境、做出决策、执行行动的智能系统。它不是被动等待输入的传统AI程序&#xff0c;而是具备"自主规划能力"的主动智能体。与传统AI最大的区别在于&#xff1a;传统AI是…

xactengine3_5.dll文件丢失找不到问题 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

2026必备!MBA论文写作TOP9 AI论文平台深度测评

2026必备&#xff01;MBA论文写作TOP9 AI论文平台深度测评 2026年MBA论文写作工具测评&#xff1a;如何选择高效可靠的AI平台 随着人工智能技术的不断进步&#xff0c;越来越多的MBA学生开始借助AI论文平台提升写作效率。然而&#xff0c;面对市场上种类繁多的工具&#xff0c;…

xactengine2_10.dll文件丢失找不到问题 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

【必看收藏】AI时代程序员生死劫:从“制造者“到“顾问“的思维大转变,不看就落后!

AI时代下&#xff0c;程序员正经历从"制造者"到"顾问"的根本性转变。代码生产成本趋近于零&#xff0c;而有价值的思考和沟通变得稀缺。未来程序员的核心价值不再是执行清晰任务&#xff0c;而是在模糊需求中主动挖掘上下文&#xff0c;理解并解决真正问题…

藏在新丰江的野趣秘境!漂流溯溪玩转河源野趣沟

位于广东省河源市源城区大桂山主峰北部的野趣沟旅游区&#xff0c;是一处以“野趣”为核心主题的自然生态景区。它毗邻万绿湖&#xff0c;地处新丰江国家森林公园范围内&#xff0c;总面积约5至8平方公里。景区内古藤巨树遮天蔽日&#xff0c;飞瀑流泉层叠分布&#xff0c;形成…

大模型时代的程序员悖论:如何避免被AI取代?收藏这篇就够了

文章探讨了AI时代程序员如何保持竞争力。AI是杠杆而非替代品&#xff0c;会放大人的判断力或错误。程序员需建立判断力&#xff0c;采用三层思考法&#xff08;先独立思考&#xff0c;再用AI验证&#xff0c;最后深度内化&#xff09;&#xff0c;区分核心与边缘技能&#xff0…

提示词工程vs上下文工程:AI交互方法论全解析(值得收藏)

本文探讨了从提示词工程到上下文技术的演进&#xff0c;分析了精简提示词设计、上下文管理的重要性及方法(压缩、结构化笔记、多智能体)。作者认为当前AI技术方案灵感源于人类认知世界的方式&#xff0c;强调应"回到事情本身"&#xff0c;围绕"人"的核心需…

从白庙渔村到飞霞山,这条北江峡山线承包你的周末惬意

在清远市区近郊&#xff0c;一条名为“北江风光峡山探秘之旅”的线路&#xff0c;串联起了北江的山水画卷与山林的自然意趣。这条线路的体验&#xff0c;由水路的悠然过渡至山间的漫步&#xff0c;一日之内可领略多种地貌景观与人文风貌。清晨可从北江畔的白庙渔村开始。渔村位…