C#作为面向对象的编程语言,提供了丰富的集合类型来满足不同场景下的数据存储和处理需求,合理选择集合类型能够有效提升程序的性能和代码的可读性。

C#集合类型分类
C#的集合主要分为泛型集合和非泛型集合两大类,非泛型集合位于System.Collections命名空间下,存储的是object类型,存在装箱拆箱的性能损耗,现在开发中更推荐使用位于System.Collections.Generic命名空间下的泛型集合,泛型集合在编译期就会确定存储的元素类型,避免了不必要的类型转换开销。
常用泛型集合介绍
List<T>
List<T>是最常用的动态数组集合,内部基于数组实现,支持自动扩容,适合存储有序的、允许重复的元素,并且需要频繁通过索引访问元素的场景。
常用操作和示例如下:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 初始化List
List<int> numList = new List<int>();
// 添加元素
numList.Add(1);
numList.Add(2);
numList.Add(3);
// 插入元素到指定索引
numList.Insert(1, 10);
// 通过索引访问元素
Console.WriteLine(numList[0]); // 输出1
// 遍历元素
foreach (int num in numList)
{
Console.WriteLine(num);
}
// 判断元素是否存在
bool hasTwo = numList.Contains(2);
Console.WriteLine(hasTwo); // 输出True
// 移除指定元素
numList.Remove(10);
}
}
Dictionary<TKey, TValue>
Dictionary<TKey, TValue>是键值对集合,基于哈希表实现,查找、插入、删除操作的时间复杂度接近O(1),适合需要通过唯一键快速查找对应值的场景,要求键不能重复。
常用操作和示例如下:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 初始化Dictionary,键为string类型,值为int类型
Dictionary<string, int> scoreDict = new Dictionary<string, int>();
// 添加键值对
scoreDict.Add("张三", 90);
scoreDict.Add("李四", 85);
// 通过键访问值
Console.WriteLine(scoreDict["张三"]); // 输出90
// 尝试获取值,避免键不存在报错
if (scoreDict.TryGetValue("王五", out int score))
{
Console.WriteLine(score);
}
else
{
Console.WriteLine("不存在王五的成绩");
}
// 遍历键值对
foreach (KeyValuePair<string, int> item in scoreDict)
{
Console.WriteLine($"姓名:{item.Key},成绩:{item.Value}");
}
// 移除指定键的键值对
scoreDict.Remove("李四");
}
}
HashSet<T>
HashSet<T>是基于哈希表实现的无序集合,不允许存储重复元素,适合需要去重或者判断元素是否存在的场景,它的添加、删除、查找操作效率都很高。
常用操作和示例如下:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 初始化HashSet
HashSet<int> numSet = new HashSet<int>();
// 添加元素,重复元素不会被添加
numSet.Add(1);
numSet.Add(2);
numSet.Add(2);
Console.WriteLine(numSet.Count); // 输出2
// 判断元素是否存在
bool hasOne = numSet.Contains(1);
Console.WriteLine(hasOne); // 输出True
// 集合操作:并集、交集、差集
HashSet<int> otherSet = new HashSet<int> { 2, 3, 4 };
numSet.UnionWith(otherSet); // 并集,numSet变为1,2,3,4
// 移除元素
numSet.Remove(1);
}
}
Queue<T>
Queue<T>是队列集合,基于循环数组实现,遵循先进先出(FIFO)的原则,适合需要按顺序处理元素,比如任务调度、消息队列等场景。
常用操作和示例如下:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 初始化队列
Queue<string> taskQueue = new Queue<string>();
// 入队
taskQueue.Enqueue("任务1");
taskQueue.Enqueue("任务2");
taskQueue.Enqueue("任务3");
// 出队,获取并移除队首元素
string firstTask = taskQueue.Dequeue();
Console.WriteLine(firstTask); // 输出任务1
// 查看队首元素但不移除
string peekTask = taskQueue.Peek();
Console.WriteLine(peekTask); // 输出任务2
// 遍历队列
foreach (string task in taskQueue)
{
Console.WriteLine(task);
}
}
}
Stack<T>
Stack<T>是栈集合,遵循后进先出(LIFO)的原则,适合需要逆序处理元素的场景,比如表达式求值、撤销操作等。
常用操作和示例如下:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 初始化栈
Stack<int> numStack = new Stack<int>();
// 入栈
numStack.Push(1);
numStack.Push(2);
numStack.Push(3);
// 出栈,获取并移除栈顶元素
int topNum = numStack.Pop();
Console.WriteLine(topNum); // 输出3
// 查看栈顶元素但不移除
int peekNum = numStack.Peek();
Console.WriteLine(peekNum); // 输出2
// 遍历栈
foreach (int num in numStack)
{
Console.WriteLine(num);
}
}
}
集合选型参考
在实际开发中可以按照以下思路选择集合类型:
- 如果需要存储有序可重复元素,且频繁通过索引访问,优先选择
List<T> - 如果需要通过唯一键快速查找对应值,优先选择
Dictionary<TKey, TValue> - 如果需要存储不可重复的元素,或者频繁判断元素是否存在,优先选择
HashSet<T> - 如果需要按照先进先出的顺序处理元素,优先选择
Queue<T> - 如果需要按照后进先出的顺序处理元素,优先选择
Stack<T>
合理选择集合类型能够减少不必要的性能损耗,让代码逻辑更清晰,是C#开发中的基础技能之一。
C#ListDictionaryHashSetQueue修改时间:2026-06-23 12:30:37