C#开发中常用的集合类型详解

数组:最基础的存储方式

C#开发中,数组是最原始也是最常用的集合型。它用来存放相同类型的多个元素,且长度固定。比如你写一个成绩管理系统,需要保存5个学生的分数,就可以用 int[] scores = new int[5]; 这种方式来定义。

数组的优点是访问速度快,通过索引可以直接定位数据。但缺点也很明显——不能动态扩容。一旦初始化后,想加新元素就得手动复制到更大的数组里,麻烦又容易出错。

int[] numbers = new int[3] {10, 20, 30};
Console.WriteLine(numbers[0]); // 输出 10

List<T>:日常开发的主力选手

真正干活的时候,大家更喜欢用 List<T>。它是泛型列表,可以自动伸缩,增删改查都方便。比如你在做一个购物车功能,商品数量不固定,用 List<string> cartItems 就比数组灵活得多。

它属于 System.Collections.Generic 命名空间下的类型,支持 Add、Remove、Insert 等方法,还能用 foreach 遍历。大多数情况下,List 几乎成了默认选择。

List<string> names = new List<string>();
names.Add("张三");
names.Add("李四");
foreach (var name in names)
{
Console.WriteLine(name);
}

Dictionary<K,V>:键值对的好帮手

当你需要根据“关键字”快速查找数据时,Dictionary 就派上用场了。比如做用户登录系统,可以用用户名作为 key,密码或用户对象作为 value 存进去,查找效率非常高。

它的底层是哈希表实现,读取和插入平均时间复杂度接近 O(1)。不过要注意的是,同一个字典里 key 必须唯一,重复添加会抛异常。

Dictionary<string, int> ageMap = new Dictionary<string, int>();
ageMap["小明"] = 25;
ageMap["小红"] = 23;
if (ageMap.ContainsKey("小明"))
{
Console.WriteLine(ageMap["小明"]);
}

HashSet<T>:去重神器

如果你有一堆数据,只想保留唯一的值,那 HashSet 再合适不过。比如从日志中提取访问过的IP地址,不想重复统计,直接往 HashSet<string> 里塞就行,它会自动过滤重复项。

除了去重,它还提供了交集、并集、差集等数学集合操作,适合处理逻辑较复杂的业务场景。

HashSet<int> uniqueNums = new HashSet<int>();
uniqueNums.Add(1);
uniqueNums.Add(2);
uniqueNums.Add(1); // 不会重复添加
Console.WriteLine(uniqueNums.Count); // 输出 2

Queue<T> 和 Stack<T>:特殊顺序的需求

有些场景对数据进出顺序有要求。Queue 是先进先出(FIFO),像排队买票一样,先来的先处理;而 Stack 是后进先出(LIFO),就像叠盘子,最后放的最先拿走。

比如做消息队列中间件的模拟程序,就可以用 Queue<string> 来缓存待处理的消息;解析表达式时,用 Stack<char> 处理括号匹配也很常见。

Queue<string> messageQueue = new Queue<string>();
messageQueue.Enqueue("任务1");
messageQueue.Enqueue("任务2");
Console.WriteLine(messageQueue.Dequeue()); // 输出 任务1
Stack<int> numStack = new Stack<int>();
numStack.Push(100);
numStack.Push(200);
Console.WriteLine(numStack.Pop()); // 输出 200