C# 都有哪些集合?

devtools/2024/11/8 14:45:49/

在 C# 中,集合(Collection)是用来存储一组数据的对象,通常是同一类型的数据。C# 提供了多种不同类型的集合,每种集合都有其独特的特点和用途。
常见的集合可以分为以下几类:数组、泛型集合、非泛型集合、其他集合类型、并发集合

1. 数组(Array)

定义:数组是 C# 中最基本的集合类型,用来存储固定大小的同类型元素。
特点:

  • 固定大小,一旦创建,大小不可更改。
  • 支持按索引访问元素,查找速度快。

常用操作:访问、修改元素、遍历、排序、查找等。
示例:

int[] arr = new int[5]; // 创建一个包含5个元素的整型数组
arr[0] = 1;  // 设置第一个元素为1
Console.WriteLine(arr[0]);  // 输出1

2. 泛型集合(Generic Collections)

定义:泛型集合是 C# 中更为强大和灵活的集合类型,通过 System.Collections.Generic 命名空间提供。它们可以存储特定类型的元素,避免了类型转换,提供了更高的类型安全。

常见泛型集合:

List < T >

定义:List < T > 是一个动态数组,可以自动调整大小。
特点:

  • 支持按索引访问。
  • 支持动态添加、删除元素。
  • 更灵活、更高效。

常用操作:添加、删除、插入、查找、排序等。
示例:

List<int> list = new List<int>();
list.Add(10);
list.Add(20);
list.Add(30);
list.RemoveAt(1);  // 删除索引为1的元素

Dictionary<TKey, TValue>

定义:Dictionary<TKey, TValue> 是一个基于键值对的集合,用于存储映射关系。
特点:

  • 键值对,允许通过键访问值。
  • 键是唯一的,值可以重复。

常用操作:添加、删除、查找、更新、键值对遍历等。
示例:

Dictionary<string, int> dict = new Dictionary<string, int>();
dict["apple"] = 5;
dict["banana"] = 3;
Console.WriteLine(dict["apple"]);  // 输出 5

HashSet< T >

定义:HashSet 是一个不允许重复元素的集合,基于哈希表实现。
特点:

  • 不允许重复元素。
  • 无序存储,无法通过索引访问。
  • 适合用来做集合运算(并集、交集、差集等)。

常用操作:添加、删除、查找、集合运算等。
示例:

HashSet<int> set = new HashSet<int>();
set.Add(1);
set.Add(2);
set.Add(3);
set.Add(2);  // 重复的元素不会添加

Queue< T >

定义:Queue 是一个先进先出(FIFO)的集合类型。
特点:

  • 只能从队列的头部移除元素。
  • 适用于需要保持元素顺序的场景。

常用操作:入队、出队、查看队头等。

示例:

Queue<int> queue = new Queue<int>();
queue.Enqueue(1);
queue.Enqueue(2);
queue.Enqueue(3);
int item = queue.Dequeue();  // 取出并移除队首元素

Stack< T >

定义:Stack 是一个后进先出(LIFO)的集合类型。
特点:

  • 只能从栈顶添加和移除元素。
  • 适用于需要回溯、递归等场景。

常用操作:入栈、出栈、查看栈顶等。
示例:

Stack<int> stack = new Stack<int>();
stack.Push(1);
stack.Push(2);
stack.Push(3);
int item = stack.Pop();  // 移除栈顶元素

3. 非泛型集合(Non-Generic Collections)

定义:非泛型集合位于 System.Collections 命名空间中,它们可以存储任何类型的数据,但使用时需要进行类型转换,因此不如泛型集合安全。

常见非泛型集合:

ArrayList

定义:ArrayList 是一个动态数组,支持任意类型的元素。
特点:

  • 不同于泛型集合,它允许存储不同类型的元素。
  • 需要使用类型转换。

示例:

ArrayList list = new ArrayList();
list.Add(10);
list.Add("hello");
int num = (int)list[0];  // 需要强制类型转换

Hashtable

定义:Hashtable 是一个键值对集合,类似于 Dictionary,但不支持泛型。
特点:

  • 键值对存储,键是唯一的,值可以重复。
  • 需要手动进行类型转换。

示例:

Hashtable table = new Hashtable();
table["name"] = "John";
table["age"] = 30;

Queue

定义:非泛型的 Queue,与泛型 Queue 类似,但不支持类型安全。
示例:

Queue queue = new Queue();
queue.Enqueue(1);
queue.Enqueue(2);

Stack

定义:非泛型的 Stack,与泛型 Stack 类似。
示例:

Stack stack = new Stack();
stack.Push(1);
stack.Push(2);

4. 其他集合类型

SortedList<TKey, TValue>

基于键的升序排列。
提供快速查找、插入和删除操作。
示例:

SortedList<int, string> sortedList = new SortedList<int, string>();
sortedList.Add(1, "apple");
sortedList.Add(3, "banana");
sortedList.Add(2, "cherry");

LinkedList< T >

基于链表实现,提供对元素的高效插入和删除操作。
与 List 不同,LinkedList 不支持按索引访问元素。
示例:

LinkedList<int> linkedList = new LinkedList<int>();
linkedList.AddLast(10);
linkedList.AddFirst(5);
linkedList.Remove(10);

5. 并发集合(Concurrent Collections)

定义:并发集合是专门为多线程环境设计的集合类,它们提供线程安全的操作。
常见并发集合:

  1. ConcurrentQueue
  2. ConcurrentStack
  3. ConcurrentDictionary<TKey, TValue>

示例:

ConcurrentDictionary<int, string> concurrentDict = new ConcurrentDictionary<int, string>();
concurrentDict[1] = "apple";

总结

C# 提供了多种集合类型来满足不同场景的需求。泛型集合通常是首选,它们提供类型安全和高效操作。对于需要线程安全的场景,可以使用并发集合。而对于简单的场景,非泛型集合依然有其适用的地方。


http://www.ppmy.cn/devtools/132336.html

相关文章

人生的决策和算法学习有感

我们做决策&#xff0c;是为了在运气面前获得更多主动权&#xff0c;而获得更多好运的方法&#xff0c;除了不断做出好的决策&#xff0c;还要让自己成为配得上这好运的人。 这种大局观体现为&#xff1a;要么是因为一个人一直很聪明地停留在自己有优势的领域&#xff0c;要么…

STM32学习-段的概念_散列文件_重定位

使用keil烧写程序时&#xff0c;程序保存在哪里&#xff1f;这个问题很好想&#xff0c;当掉电时&#xff0c;RAM中的数据会被清除&#xff0c;所以程序数据只能保存在ROM区&#xff0c;对于STM32则是保存在内部的Flash中&#xff0c;那么程序运行是在ROM/Flash还是RAM呢&#…

景联文科技专业数据标注公司:高质量数据标注推动AI产业发展

在当今数据驱动的时代&#xff0c;高质量的数据标注对于机器学习、自然语言处理&#xff08;NLP&#xff09;和计算机视觉等技术领域的发展起着至关重要的作用。 数据标注是指对原始数据进行处理&#xff0c;标记对象的特征&#xff0c;生成满足机器学习训练要求的可读数据编码…

【算法】(Python)贪心算法

贪心算法&#xff1a; 又称贪婪算法&#xff0c;greedy algorithm。贪心地追求局部最优解&#xff0c;即每一步当前状态下最优选择。试图通过各局部最优解达到最终全局最优解。但不从整体最优上考虑&#xff0c;不一定全局最优解。步骤&#xff1a;从初始状态拆分成一步一步的…

【Spring】更加简单的将对象存入Spring中并使用

前言 本期讲解&#xff1a;通过Controller、Service、Repository、Component、Configurtion类注解、Bean方法注解&#xff0c;来更加简单的在Spring中存与读对象。 目录 1. 类注解 1.1 通过标签 1.2 使用类注解 1.3 什么是类注解 1.4 获取Bean对象命名问题 2. 方法注解 …

Linux驱动开发——零散知识分享

本篇文章记录我学习Linux驱动时的一些零散知识&#xff0c;旨在记录成长&#xff0c;分享心得&#xff0c;希望我的分享能给你带来不一样的收获&#xff01; 1、C 语言字符串转换为整数二点函数atoi 在 C 语言中&#xff0c;atoi 函数用于将字符串转换为整数。其原型定义在头文…

网络安全从入门到精通(特别篇I):应急响应之APT事件处置流程

应急响应 应急响应之APT处置流程1.现场询问1.1 了解威胁事件表现1.2 了解威胁事件发现时间1.3 了解系统架构,如服务器类型、业务架构、网络拓扑等2 判断安全事件状态3 确认事件对象4 确定事件时间5 问题排查应急响应之APT处置流程 1.现场询问 1.1 了解威胁事件表现 1.C&…

【Python爬虫实战】DrissionPage 与 ChromiumPage:高效网页自动化与数据抓取的双利器

&#x1f308;个人主页&#xff1a;易辰君-CSDN博客 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、DrissionPage简介 &#xff08;一&#xff09;特点 &#xff08;二&#xff09;安装 &#xff08;三…