理解C#里面的集合有哪些?怎么用,什么是安全集合?

在这里插入图片描述

介绍

在C#中,集合是一种用于存储和操作多个元素的数据结构。它们提供了各种操作,如添加、删除、查找等,以及遍历集合中的元素。集合通常根据其实现方式和行为特征进行分类。

集合继承IEnumerable

在C#中,几乎所有的集合类型都实现了IEnumerable接口或其泛型版本IEnumerable<T>,以支持迭代和枚举集合中的元素。这意味着它们都具有GetEnumerator()方法,该方法返回一个实现了IEnumerator接口或IEnumerator<T>接口的对象,用于遍历集合中的元素。

但是,并非所有集合都直接继承自IEnumerable接口。例如,LinkedList<T>继承自System.Collections.Generic.LinkedList<T>,而LinkedList<T>实现了IEnumerable<T>接口,但并未直接继承自IEnumerable。不过,由于IEnumerable<T>继承自IEnumerable,因此LinkedList<T>也间接地支持IEnumerable

总的来说,虽然不是所有集合都直接继承自IEnumerable,但它们通常都实现了IEnumerable接口或其泛型版本,以支持在foreach循环中迭代集合中的元素。

在C#中,集合类型有很多种,每种都有其特定的使用环境和适用场景。
数组 (Array):
用于存储固定大小的同类型元素。
适用于需要快速随机访问元素的情况。

int[] numbers = new int[5] { 1, 2, 3, 4, 5 };

列表 (List):
用于存储可变大小的同类型元素序列。
适用于需要频繁添加或删除元素的场景。

List<string> names = new List<string>();
names.Add("Alice");
names.Add("Bob");

队列 (Queue):
用于实现先进先出(FIFO)的数据结构。
适用于任务调度、消息传递等场景。

Queue<int> queue = new Queue<int>();
queue.Enqueue(1);
queue.Enqueue(2);

栈 (Stack):
用于实现后进先出(LIFO)的数据结构。
适用于表达式求值、深度优先搜索等场景。

Stack<string> stack = new Stack<string>();
stack.Push("A");
stack.Push("B");

字典 (Dictionary):
用于存储键值对集合。
适用于需要快速通过键查找值的情况。

Dictionary<string, int> ages = new Dictionary<string, int>();
ages.Add("Alice", 30);
ages.Add("Bob", 35);

集合 (Set):
用于存储独一无二的元素。
适用于需要去重或集合运算的场景。

HashSet<int> set = new HashSet<int>();
set.Add(1);
set.Add(2);

链表 (LinkedList):
用于存储元素以节点形式组织的数据结构。
适用于频繁的插入和删除操作,但不适用于随机访问。

LinkedList<string> linkedList = new LinkedList<string>();
linkedList.AddLast("A");
linkedList.AddLast("B");

排序列表 (SortedList):
用于存储已排序的键值对集合。
适用于需要快速查找和有序遍历的场景。

SortedList<int, string> sortedList = new SortedList<int, string>();
sortedList.Add(3, "C");
sortedList.Add(1, "A");

有序字典 (SortedDictionary):
用于存储已排序的键值对集合。
适用于需要有序键值对集合的场景。

SortedDictionary<int, string> sortedDictionary = new SortedDictionary<int, string>();
sortedDictionary.Add(3, "C");
sortedDictionary.Add(1, "A");

可观察集合 (ObservableCollection):
用于实现数据绑定和通知变化的动态集合。
适用于需要与界面交互并实时更新的场景。

ObservableCollection<string> observableCollection = new ObservableCollection<string>();
observableCollection.Add("Item 1");

键控集合 (KeyedCollection):
用于存储具有唯一键的元素集合。
适用于需要通过键进行查找和检索的场景。

public class PersonCollection : KeyedCollection<string, Person>
{protected override string GetKeyForItem(Person item) => item.Name;
}

树形集合 (Tree):
用于存储具有层级结构的数据。
适用于表示组织结构、文件系统等场景。

// 示例:自定义树形结构
public class TreeNode<T>
{public T Data { get; set; }public List<TreeNode<T>> Children { get; set; } = new List<TreeNode<T>>();
}

线程安全的集合
在多线程环境中,为了确保线程安全,可以使用以下线程安全的集合:

  1. ConcurrentBag<T>:用于在并行操作中存储对象的无序集合。
  2. ConcurrentDictionary<TKey, TValue>:用于在多线程环境中存储键/值对的字典。
  3. ConcurrentQueue<T>:用于在多线程环境中实现先进先出(FIFO)的队列。
  4. ConcurrentStack<T>:用于在多线程环境中实现后进先出(LIFO)的栈。
  5. BlockingCollection<T>:提供了一个线程安全的集合,用于在生产者-消费者模式中使用。

这些线程安全的集合类型能够在多线程环境中保证数据的一致性和完整性,避免出现竞态条件和死锁等问题。

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

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

相关文章

垂直领域大模型搭建训练指南,ChemLLM论文介绍

ChemLLM论文介绍&#xff0c;垂直领域模型搭建训练指南(ChemLLM: A Chemical Large Language Model) 返回论文目录 1.论文简介 论文是上海人工智能实验室的工作&#xff0c;想训练一个化学垂直领域的对话大模型&#xff0c;然而现有的化学数据往往是结构性的&#xff0c;所以…

Nodejs基于vue的个性化服装衣服穿搭搭配系统sprinboot+django+php

本个性化服装搭配系统主要根据用户数据信息&#xff0c;推荐一些适合的搭配穿搭&#xff0c;同时&#xff0c;用户也可自己扫描上传自身衣物以及输入存放位置&#xff0c;搭配后存储到“我的搭配”中&#xff0c;以便下次挑选&#xff0c;既可以节省搭配时间&#xff0c;也方便…

【MySQL】MySQL复合查询--多表查询自连接子查询

文章目录 1.基本查询回顾2.多表查询3.自连接4.子查询 4.1单行子查询4.2多行子查询4.3多列子查询4.4在from子句中使用子查询4.5合并查询 4.5.1 union4.5.2 union all 1.基本查询回顾 表的内容如下&#xff1a; mysql> select * from emp; ----------------------------…

Opencv实战(5)平滑处理与常见函数

平滑处理 Opencv实战&#xff1a; Opencv(1)读取与图像操作 Opencv(2)绘图与图像操作 Opencv(3)详解霍夫变换 Opencv(4)详解轮廓 文章目录 平滑处理1.均值滤波2.方框滤波3.高斯滤波4.中值滤波5.双边滤波 常见函数(1).createTrackbar()(2).SetMouseCallback() 图像的平滑处理是…

[element]element-ui框架下载

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐如果觉得文章写的不错&#xff0c;欢迎点个关注一键三连&#x1f609;有写的不好的地方也欢迎指正&#xff0c;一同进步&#x1f601;…

2024腾讯云服务器优惠价格表又降价了,给同行干emo了

腾讯云优惠活动2024新春采购节活动上线&#xff0c;云服务器价格已经出来了&#xff0c;云服务器61元一年起&#xff0c;配置和价格基本上和上个月没什么变化&#xff0c;但是新增了8888元代金券和会员续费优惠&#xff0c;腾讯云百科txybk.com整理腾讯云最新优惠活动云服务器配…

常用sql语句及其优化

文章目录 介绍常用sql语句1. 数据查询1.1 SELECT 语句1.2 DISTINCT 关键字1.3 WHERE 子句1.4 ORDER BY 子句1.5 LIMIT 关键字 2. 数据更新2.1 INSERT INTO 语句2.2 UPDATE 语句2.3 DELETE FROM 语句 3. 数据管理3.1 CREATE TABLE 语句3.2 ALTER TABLE 语句3.3 DROP TABLE 语句 …

Python进阶学习:Pandas--将一种的数据类型转换为另一种类型(astype())

Python进阶学习&#xff1a;Pandas–将一种的数据类型转换为另一种类型(astype()) &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&…

android零基础入门,零基础入门android

工欲行其事&#xff0c;必先利其器 1.B4A B4A是Android的基础版&#xff0c;这是一种可简化编程的Android的应用程序开发工具。这是一个IDE&#xff0c;可以允许开发者使用Basic语言来创建Android移动应用。Basic语言是一种过程化编程语言&#xff0c;因为其简单易学&#xff…

linux系统如何安装nginx

首先下载nginx安装包 wget -c http://nginx.org/download/nginx-1.23.1.tar.gz然后解压安装包 tar -zxvf nginx-1.23.1.tar.gz如果服务器没有wget&#xff0c;可以安装一下&#xff0c;有的话可以跳过 yum install -y wget 然后安装相关依赖 yum install -y gcc-c zlib zl…

分布式调度平台XXL-JOB

相对来说&#xff0c;xxl-job中心式的调度平台轻量级&#xff0c;开箱即用&#xff0c;操作简易&#xff0c;上手快&#xff0c;与SpringBoot有非常好的集成&#xff0c;而且监控界面就集成在调度中心&#xff0c;界面又简洁&#xff0c;对于企业维护起来成本不高&#xff0c;还…

PRL算法调控

伴随汽车电子技术发展&#xff0c;传统轮式车辆制动系统的气体或液体传输管路长&#xff0c;阀类原件多原有的真空助力系统无法兼顾车辆的再生制动功能&#xff0c;而再生制动功能是混合动力车辆是混动车辆最主要的市场优势之一&#xff0c;真空助力器逐渐被eBooster 所取代。针…