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

news2024/9/19 10:54:03

在这里插入图片描述

介绍

在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.coloradmin.cn/o/1480806.html

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

相关文章

uniapp同步将本地图片转换为base64,支持微信、H5、APP

接上篇&#xff0c;少了一个方法的源代码。 先上代码&#xff1a; ploadFilePromiseSync (url) > { return new Promise((resolve, reject) > { // #ifdef MP-WEIXIN uni.getFileSystemManager().readFile({ filePath: url, encoding: base64, success: res > { let …

TVM 和模型优化的概述(1)

文章目录 1. 从 Tensorflow、PyTorch 或 Onnx 等框架导入模型&#xff08;model&#xff09;。2.翻译成 Relay3. lower 到 张量表达式。4. 使用 auto-tuning 模块 AutoTVM 或 AutoScheduler 搜索最佳 schedule。5. 选择最佳配置进行模型编译。6. lower 到 TIR。7. 编译成机器码…

【JavaScript】面试手撕节流

引入 上篇我们讲了防抖&#xff0c;这篇我们就谈谈防抖的好兄弟 – 节流。这里在老生常谈般的提一下他们两者之间的区别,顺带给读者巩固下。 PS: 开源节流中节流与这个技术上的节流&#xff0c;个人认为本质上是一样的。 开源节流的节流指的是节省公司的金钱开支。前端技术上的…

#stm学习总结 (二十八)硬件随机数实验

28.1 随机数发生器简介 STM32F407 自带了硬件随机数发生器&#xff08;RNG&#xff09;&#xff0c;RNG 处理器是一个以连续模拟噪声为基础的随机数发生器&#xff0c;在主机读数时提供一个 32 位的随机数。 28.1.1 RNG 框图 STM32F407 的随机数发生器&#xff08;RNG&#x…

Python实现双向链表:从基础到应用

一、引言 双向链表是一种比单向链表更复杂的数据结构&#xff0c;每个节点除了包含数据和指向下一个节点的指针外&#xff0c;还包含一个指向前一个节点的指针。这种结构使得我们可以从链表的任何节点开始&#xff0c;向前或向后遍历链表。 目录 一、引言 二、节点定义 三、…

谷歌最强开源大模型亮相!Gemini技术下放,笔记本就能跑,可商用

明敏 发自 凹非寺 量子位 | 公众号 QbitAI 谷歌大模型&#xff0c;开源了&#xff01; 一夜之间&#xff0c;Gemma系列正式上线&#xff0c;全面对外开放。 它采用Gemini同款技术架构&#xff0c;主打开源和轻量级&#xff0c;免费可用、模型权重开源、允许商用&#xff0c;…

C++ STL:set/multiset、map/multimap源码剖析

C STL中set和map底层数据结构为红黑树rb_tree。具体可以参考这篇文章。 ​​​​​​C STL &#xff1a;红黑树rb_tree源码剖析-CSDN博客 set插入时插的就是key&#xff0c; map插入时插的是value(键值对)&#xff0c; 排序时底层的红黑树会根据key_compare(也就是模版…

[回归指标]R2、PCC(Pearson’s r )

R2相关系数 R2相关系数很熟悉了&#xff0c;就不具体解释了。 皮尔逊相关系数&#xff08;PCC&#xff09; 皮尔逊相关系数是研究变量之间线性相关程度的量&#xff0c;R方和PCC是不同的指标。R方衡量x和y的接近程度&#xff0c;PCC衡量的是x和y的变化趋势是否相同。R方是不…

可用于智能客服的完全开源免费商用的知识库项目

介绍 FastWiki项目是一个高性能、基于最新技术栈的知识库系统&#xff0c;专为大规模信息检索和智能搜索设计。利用微软Semantic Kernel进行深度学习和自然语言处理&#xff0c;结合.NET 8和MasaBlazor前端框架&#xff0c;后台采用.NET 8MasaFrameworkSemanticKernel&#xff…

深入理解Java泛型及其在实际编程中的应用

第1章&#xff1a;泛型的起源与重要性 大家好&#xff0c;我是小黑&#xff0c;在Java里&#xff0c;泛型&#xff08;Generics&#xff09;是一种不可或缺的特性&#xff0c;它允许咱们在编码时使用类型&#xff08;Type&#xff09;作为参数。这听起来可能有点绕&#xff0c…

LeetCode 2581.统计可能的树根数目:换根DP(树形DP)

【LetMeFly】2581.统计可能的树根数目&#xff1a;换根DP(树形DP) 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-number-of-possible-root-nodes/ Alice 有一棵 n 个节点的树&#xff0c;节点编号为 0 到 n - 1 。树用一个长度为 n - 1 的二维整数数组 edges…

文件基础和文件fd

文章目录 预备知识C语言的文件接口系统调用文件fd 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站。 预备知识 我们平时说文件就是说文件里…

园区停车管理系统的设计与实现

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一 、设计说明 1.1 选题…

第十四篇【传奇开心果系列】Python的文本和语音相互转换库技术点案例示例:深度解读Azure Cognitive Services个性化推荐系统

传奇开心果博文系列 系列博文目录Python的文本和语音相互转换库技术点案例示例系列 博文目录前言一、个性化推荐系统介绍和关键功能以及优势解说二、雏形示例代码三、个性化推荐示例代码四、实时推荐示例代码五、多种推荐算法示例代码六、易于集成示例代码七、数据安全和隐私保…

minio多版本

minio的多版本是怎么实现的 1、界面上传3次1M文件&#xff0c;可以显示3个版本的 2、在文件名1M目录下会有3个uuid为名的目录 3、其中的xl.meta文件可以使用xl-meta工具解析&#xff0c;这里会记录详细的版本信息 {"Versions": [{"Header": {"Flag…

快速下载Huggingface的大语言模型

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Huggingface是什么&#xff1f;二、基于官方huggingface-cli下载&#xff08;基础&#xff0c;断线风险&#xff09;1.安装hf下载环境2.配置环境变量3.注册…

Container killed on request. Exit code is 143

Bug信息 WARN YarnAllocator: Container marked as failed: container_e33_1480922439133_0845_02_000002 on host: hdp4. Exit status: 143. Diagnostics: Container killed on request. Exit code is 143 Container exited with a non-zero exit code 143 Killed by externa…

css 面试 px,rem,em 区别

一、px是决定单位&#xff0c;一旦设置了就无法因为适应页面大小而改变。 二、em和rem 是相对长度单位&#xff0c; 相对于px更具有灵活性&#xff0c;更适用于响应式布局。 三、em是相对于其父元素来设置字体大小的&#xff0c;一般都是以<body>的“font-size”为基准…

Java核心-异常处理

上一次学完了Java的核心类与API&#xff0c;这次来学习异常处理。我们都知道&#xff0c;Java语言具有健壮性和安全性&#xff0c;而异常处理机制就是其重要保证。如下 一、类型 错误(Error)和异常(Exception)。这里只讨论 Exception 类型的异常处理。 1、错误(Error) Err…

浏览器卡顿解决办法 —— DNS设置

1.Windows - 设置 2.网络和Internet 3.以太网 - 更改适配器选项 4.点击你现在用的网络 (WLAN或以太网)&#xff0c;右键属性 5.双击IPv4协议&#xff0c;DNS地址首选114.114.114.114 南京信风网络科技有限公司&#xff0c;成立于2000年&#xff0c;是一家位于中国南京的高…