集合(Collections)
集合 是存储多个对象的结构。C# 提供了两类集合:
-
非泛型集合 :如
ArrayList
、Hashtable
,在 C# 2.0 之前常用,但由于它们使用object
类型存储元素,因此需要进行类型转换,可能导致运行时错误和性能损失(装箱和拆箱)。 -
泛型集合 :如
List<T>
、Dictionary<TKey, TValue>
,使用泛型类存储数据,提供了类型安全和性能的改进,是 C# 2.0 之后的首选集合类型。
常见泛型集合
List<T>
List<T>
是最常用的泛型集合,它类似于动态数组,可以存储任意数量的元素。
List<int> numbers = new List<int>();
numbers.Add(1);
numbers.Add(2);
numbers.Add(3);
foreach (int number in numbers)
{
Console.WriteLine(number);
}
Dictionary<TKey, TValue>
Dictionary<TKey, TValue>
是一种键值对的集合,允许你根据键来存取值。
特点:
1.键值对存储
2.键唯一性:键(TKey)在字典中唯一且不可重复
3.快速查找
4.无顺序
-
键的唯一性 和高效查找 是
Dictionary
的核心特点。Dictionary<string, int> ages = new Dictionary<string, int>();
ages.Add("Alice", 25);
ages.Add("Bob", 30);
Console.WriteLine(ages["Alice"]); // 输出: 25
Queue<T>
Queue<T>
是先进先出(FIFO-先进先出数据缓存器)的集合。它用于在你需要按顺序处理对象时使用。
Queue<string> queue = new Queue<string>();
queue.Enqueue("First");
queue.Enqueue("Second");
queue.Enqueue("Third");
Console.WriteLine(queue.Dequeue()); // 输出: First
Stack<T>
Stack<T>
是后进先出(LIFO)的集合。它用于需要按逆序处理对象时使用。
Stack<string> stack = new Stack<string>();
stack.Push("First");
stack.Push("Second");
stack.Push("Third");
Console.WriteLine(stack.Pop()); // 输出: Third
Queue<T>
和 Stack<T>
的对比
特性 | Queue<T> |
Stack<T> |
---|---|---|
原则 | 先进先出(FIFO) | 后进先出(LIFO) |
添加元素方法 | Enqueue(T) |
Push(T) |
移除元素方法 | Dequeue() |
Pop() |
查看下一个元素 | Peek() |
Peek() |
适合的场景 | 按顺序处理任务的场景 | 递归、回溯、历史记录管理等场景 |
泛型集合的优势
- 类型安全:在编译时检查类型,防止无效类型插入集合。
- 避免装箱/拆箱:在处理值类型时,泛型集合避免了频繁的装箱和拆箱操作,从而提升性能。
- 更易维护和理解:泛型集合提供了更清晰的代码,容易维护和扩展。