C#集合类是.NET框架中用于存储和管理一组对象的重要类型,它们大多位于System.Collections和System.Collections.Generic命名空间下,不同的集合类有着不同的底层实现和适用场景,开发者可以根据实际需求选择合适的类型。

C#集合类的分类
C#的集合类可以按照是否支持泛型分为非泛型集合和泛型集合两大类,也可以按照存储结构分为列表类、字典类、集合类、队列栈类等,下面分别介绍常见的集合类型。
非泛型集合类
非泛型集合是.NET早期提供的集合类型,存储在System.Collections命名空间下,它们的元素类型都是object,使用时需要进行装箱和拆箱操作,性能相对较差,现在更推荐使用泛型集合。
- ArrayList:动态数组,长度可以自动扩容,支持添加、删除、查找元素,但是存储值类型时会有装箱拆箱开销。
- Hashtable:键值对集合,通过键的哈希值来存储和查找元素,键和值都是object类型,同样存在装箱拆箱问题。
- Queue:队列,遵循先进先出的原则,常用于需要按顺序处理元素的场景。
- Stack:栈,遵循后进先出的原则,适合需要回溯操作的场景。
泛型集合类
泛型集合位于System.Collections.Generic命名空间下,在声明时就需要指定元素类型,避免了装箱拆箱操作,类型更安全,性能也更好,是现在开发中的首选。
列表类集合
List<T>是最常用的泛型集合之一,底层是动态数组,支持通过索引快速访问元素,也提供了丰富的增删改查方法。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 声明一个存储int类型的List
List<int> numberList = new List<int>();
// 添加元素
numberList.Add(1);
numberList.Add(2);
numberList.Add(3);
// 通过索引访问元素
Console.WriteLine(numberList[0]); // 输出1
// 遍历元素
foreach (int num in numberList)
{
Console.WriteLine(num);
}
}
}
LinkedList<T>是双向链表实现的集合,插入和删除中间元素的效率比List<T>高,但是不支持索引访问,查找元素需要遍历整个链表。
字典类集合
Dictionary<TKey, TValue>是泛型键值对集合,通过键的哈希值存储数据,查找、插入、删除元素的时间复杂度接近O(1),键必须唯一。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 声明键为string,值为int的字典
Dictionary<string, int> scoreDict = new Dictionary<string, int>();
// 添加键值对
scoreDict.Add("张三", 90);
scoreDict.Add("李四", 85);
// 通过键获取值
Console.WriteLine(scoreDict["张三"]); // 输出90
// 判断键是否存在
if (scoreDict.ContainsKey("王五"))
{
Console.WriteLine("存在王五的成绩");
}
}
}
还有SortedDictionary<TKey, TValue>,它会按照键的顺序对元素进行排序,底层是二叉搜索树实现,而SortedList<TKey, TValue>则是通过数组实现的有序键值对集合,两者适用场景略有不同。
集合类(去重场景)
HashSet<T>是哈希集合,元素不能重复,底层是哈希表实现,添加、删除、查找元素的效率都很高,适合需要去重的场景。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
HashSet<int> numSet = new HashSet<int>();
numSet.Add(1);
numSet.Add(2);
numSet.Add(1); // 重复元素不会被添加
Console.WriteLine(numSet.Count); // 输出2
}
}
SortedSet<T>则是会自动对元素进行排序的集合,元素同样不能重复。
队列和栈
泛型版本的Queue<T>和Stack<T>分别对应非泛型的队列和栈,避免了装箱拆箱,类型更安全。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
Queue<string> taskQueue = new Queue<string>();
taskQueue.Enqueue("任务1");
taskQueue.Enqueue("任务2");
Console.WriteLine(taskQueue.Dequeue()); // 输出任务1,遵循先进先出
Stack<string> historyStack = new Stack<string>();
historyStack.Push("页面1");
historyStack.Push("页面2");
Console.WriteLine(historyStack.Pop()); // 输出页面2,遵循后进先出
}
}
线程安全集合类
在多线程场景下,普通的集合类不是线程安全的,需要使用System.Collections.Concurrent命名空间下的线程安全集合,比如ConcurrentDictionary<TKey, TValue>、ConcurrentQueue<T>、ConcurrentStack<T>等,这些集合类内部实现了线程同步机制,可以在多线程环境下安全使用。
如何选择C#集合类
选择集合类时可以参考以下原则:如果需要存储键值对,优先选择Dictionary<TKey, TValue>;如果需要动态数组且经常按索引访问,选择List<T>;如果需要去重选择HashSet<T>;如果需要先进先出处理选择Queue<T>;如果是多线程场景选择对应的线程安全集合;如果不需要泛型特性才考虑非泛型集合。
C#集合类ListDictionaryICollection修改时间:2026-07-13 12:48:30