理解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):

用于存储固定大小的同类型元素。

适用于需要快速随机访问元素的情况。

csharp 复制代码
int[] numbers = new int[5] { 1, 2, 3, 4, 5 };

列表 (List):

用于存储可变大小的同类型元素序列。

适用于需要频繁添加或删除元素的场景。

csharp 复制代码
List<string> names = new List<string>();
names.Add("Alice");
names.Add("Bob");

队列 (Queue):

用于实现先进先出(FIFO)的数据结构。

适用于任务调度、消息传递等场景。

csharp 复制代码
Queue<int> queue = new Queue<int>();
queue.Enqueue(1);
queue.Enqueue(2);

栈 (Stack):

用于实现后进先出(LIFO)的数据结构。

适用于表达式求值、深度优先搜索等场景。

csharp 复制代码
Stack<string> stack = new Stack<string>();
stack.Push("A");
stack.Push("B");

字典 (Dictionary):

用于存储键值对集合。

适用于需要快速通过键查找值的情况。

csharp 复制代码
Dictionary<string, int> ages = new Dictionary<string, int>();
ages.Add("Alice", 30);
ages.Add("Bob", 35);

集合 (Set):

用于存储独一无二的元素。

适用于需要去重或集合运算的场景。

csharp 复制代码
HashSet<int> set = new HashSet<int>();
set.Add(1);
set.Add(2);

链表 (LinkedList):

用于存储元素以节点形式组织的数据结构。

适用于频繁的插入和删除操作,但不适用于随机访问。

csharp 复制代码
LinkedList<string> linkedList = new LinkedList<string>();
linkedList.AddLast("A");
linkedList.AddLast("B");

排序列表 (SortedList):

用于存储已排序的键值对集合。

适用于需要快速查找和有序遍历的场景。

csharp 复制代码
SortedList<int, string> sortedList = new SortedList<int, string>();
sortedList.Add(3, "C");
sortedList.Add(1, "A");

有序字典 (SortedDictionary):

用于存储已排序的键值对集合。

适用于需要有序键值对集合的场景。

csharp 复制代码
SortedDictionary<int, string> sortedDictionary = new SortedDictionary<int, string>();
sortedDictionary.Add(3, "C");
sortedDictionary.Add(1, "A");

可观察集合 (ObservableCollection):

用于实现数据绑定和通知变化的动态集合。

适用于需要与界面交互并实时更新的场景。

csharp 复制代码
ObservableCollection<string> observableCollection = new ObservableCollection<string>();
observableCollection.Add("Item 1");

键控集合 (KeyedCollection):

用于存储具有唯一键的元素集合。

适用于需要通过键进行查找和检索的场景。

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

树形集合 (Tree):

用于存储具有层级结构的数据。

适用于表示组织结构、文件系统等场景。

csharp 复制代码
// 示例:自定义树形结构
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>:提供了一个线程安全的集合,用于在生产者-消费者模式中使用。

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

相关推荐
wujian831110 小时前
怎么用千问生成word文档:从「格式崩」到「一键过」,AI导出鸭打通最后半厘米
人工智能·ai·c#·word·豆包·deepseek·ai导出鸭
安全指北针11 小时前
AI编程工具供应链安全实战:当你的AI编码助手成为跳板
人工智能·安全·ai编程
迪康Defender11 小时前
AI 重构终端安全运营:智能分析中枢 AI Insight 模块架构与落地场景深度解析
运维·网络·人工智能·其他·安全·重构·架构
zlinear数据采集卡12 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
XR12345678812 小时前
医院网络安全与等保合规选型指南
安全·web安全
唐青枫13 小时前
别把 ImmutableArray 当成只读 List:C#.NET 不可变数组深入详解
c#·.net
西安景驰电子13 小时前
《PTP精确时间协议系列》第一篇:从原理到应用,全面解读IEEE 1588
linux·运维·服务器·开发语言·网络·windows·php
Bruce_Liuxiaowei13 小时前
基于微步在线威胁情报的公网 IP 攻击迹象监测:threatbook_query 脚本全解析与 BruceSec 平台整合实践
数据库·tcp/ip·安全·网络安全·智能体
ZJU_统一阿萨姆13 小时前
【DSH】如何将 DeepSeek Harness 嵌入生产环境?万字解构 DeepSeek Agent Harness 的运行机制与安全边界
前端·javascript·安全