首页 > 编程语言 >C# 都有哪些集合?

C# 都有哪些集合?

时间:2024-11-07 20:44:51浏览次数:3  
标签:元素 示例 C# 哪些 泛型 Add 集合 new

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

标签:元素,示例,C#,哪些,泛型,Add,集合,new
From: https://blog.csdn.net/liuchunyu0130/article/details/143586024

相关文章

  • 这款Chrome 插件,使浏览器页面快速滑动到最底部和最顶部,并且还能...
    前言前几日我在使用谷歌浏览器,也就是chrome的时候,浏览一个内容很长的页面,由于页面上的内容有前后关联,所以我必须不停地切换到上面和下面。这非常不方便。使我非常抓狂。后来,我灵机一动,去谷歌浏览器的插件市场上搜索了一下有没有快速回到底部和顶部的插件,结果,还真有。这下就方便了......
  • Ubuntu Focal 20.04 (LTS) 安装 Docker
    官方安装文档:https://docs.docker.com/engine/install/ubuntu/系统要求:ubuntu必须是以下几个系统之一,64位。UbuntuNoble24.04(LTS)UbuntuJammy22.04(LTS)UbuntuFocal20.04(LTS)查看系统内核$uname-a安装步骤:1.更新ubuntu$sudoapt-getupdate2.添加Docker库......
  • 什么是CRM,CRM有什么作用,CRM主要功能有哪些?
    今天我们就开门见山的好好介绍一下CRM系统是什么?CRM系统有什么用?以及CRM的主要用途有哪些?本文没有套路,全是真情实感~首先,CRM是什么?CRM指的是客户关系管理,是CustomerRelationshipManagement的缩写。是一种通过建立和维护与客户的良好关系,提高客户满意度和忠诚度的管理平台。......
  • 数据结构_链表_单向循环链表 & 双向链表的初始化、插入、删除、修改、查询打印(基于C语
    一、单向循环链表的原理与应用思考:对于单向链表而言,想要遍历链表,则必须从链表的首结点开始进行遍历,请问有没有更简单的方案实现链表中的数据的增删改查?回答:是有的,可以使用单向循环的链表进行设计,单向循环的链表的使用规则和普通的单向链表没有较大的区别,需要注意:单向循环链表的......
  • Cobweb-中级
    源码泄露可以直接看到源码存在sql注入反弹shellpayloadhttp://192.168.167.162/phpinfo%22%20%20union%20select%20'system(%22nc%20-e%20/bin/bash%20192.168.45.250%2080%22);echo%2011122;'%20order%20by%201%20desc%20%20--%20查看具有suid的命令发现screen命令存在漏洞......
  • CF Round 982(Div 2)
    游记还是VP口胡了ABCD的做法,然后C假了打代码其实挺难的题解A反复观看样例可知,如果两个开关状态不一样灯泡开,否则灯泡关如果要灯泡开着的尽可能少,那么相同状态的配对尽可能多此时就是\(0\)和\(0\)配对,\(1\)和\(1\)配对,如果有落单的\(0\)必定有落单的\(1\),最多凑\(1\)对没......
  • 大数据学习笔记 第5天 ZooKeeper 3.6.3安装部署 CAP原则 Paxos算法 ZAB协议详解
    ZooKeeper3.6.3重点CAP原则Paxos算法存储模型和监听机制一、集群与分布式集群:将一个任务部署在多个服务器,每个服务器都能独立完成该任务。分布式:将一个任务拆分成若干个子任务,由若干个服务器分别完成这些子任务,每个服务器只能完成某个特定的子任务。从概念上就可......
  • 论文翻译 | Teaching Algorithmic Reasoning via In-context Learning
    摘要        大型语言模型(LLMs)通过扩大模型和数据规模,展现了不断增强的上下文学习能力。尽管取得了这一进展,LLMs仍然无法解决算法推理问题。尽管在提供最终答案的同时给出解释促进了在多步骤推理问题上的进一步改进,但Anil等人(2022年)指出,即使是简单的算法推理任务,比如......
  • 区分访问修饰符public、private和protected
      public、private和protected都是java的访问修饰符,那如何来区分他们三个呢?这三个修饰符都分别表示什么意思呢?1.public   public的意思是公共的,是java中的一种修饰符,应用在java中表示该数据(成员函数)是对所有用户开放的,所有用户都可以直接进行使用。2.private  p......
  • 论文翻译 | Evaluating the Robustness of Discrete Prompts
    摘要        离散提示已被用于调整预训练语言模型,以适应不同的NLP任务。特别是,从一小组训练实例中生成离散提示的自动方法已经报告了优越的性能。然而,仔细观察习得的提示会发现,它们包含嘈杂和反直觉的词汇结构,而这些在手工写的提示中是不会遇到的。这提出了一个重要......