C#基础知识-个人学习笔记(3)数据结构相关API
·
一、列表
1.List<T>
| 分类 | 方法 | 描述 |
|---|---|---|
| 添加 | Add(T item) |
将元素添加到列表末尾。 |
AddRange(IEnumerable<T> collection) |
将另一个集合中的所有元素添加到末尾。 | |
Insert(int index, T item) |
在指定索引位置插入元素。 | |
| 删除 | Remove(T item) |
移除列表中第一个匹配的元素。 |
RemoveAt(int index) |
移除指定索引位置的元素。 | |
RemoveRange(int index, int count) |
移除从指定索引开始的连续多个元素。 | |
Clear() |
移除列表中的所有元素。 | |
| 查找 | IndexOf(T item) |
搜索指定元素,并返回其第一次出现的索引。 |
Contains(T item) |
判断某个元素是否在列表中。 | |
Find(Predicate<T> match) |
查找符合条件(由lambda表达式定义)的第一个元素。 | |
Exists(Predicate<T> match) |
判断列表中是否存在符合条件的元素。 | |
| 访问 | Count |
获取列表中实际包含的元素个数。 |
this[int index] (索引器) |
通过索引访问或修改元素。 | |
Capacity |
获取或设置列表在不调整大小的情况下能容纳的总元素数。 | |
TrimExcess() |
将容量设置为列表中实际元素的数量,用于节省内存。 | |
ForEach(Action<T> action) |
对列表中的每个元素执行指定操作。 | |
| 排序 | Sort() |
对列表中的元素进行排序。 |
| 其他 | ToArray() |
将列表中的元素复制到新数组中。 |
2.LinkedList<T>
LinkedList<T>是一个泛型双向链表,插入/删除元素快,但不支持随机访问。
| 分类 | 方法 | 说明 |
|---|---|---|
| 添加 | AddFirst(T) / AddFirst(LinkedListNode<T>) |
在链表头部添加新节点 |
AddLast(T) / AddLast(LinkedListNode<T>) |
在链表尾部添加新节点 | |
AddBefore(LinkedListNode<T>, T) |
在指定节点之前插入 | |
|
|
在指定节点之后插入 | |
| 删除 | RemoveFirst() |
移除第一个节点 |
RemoveLast() |
移除最后一个节点 | |
Remove(T) / Remove(LinkedListNode<T>) |
移除指定值的第一个匹配节点或指定节点实例 | |
Clear() |
清空整个链表 | |
| 查找 | Find(T) |
从头部开始查找第一个匹配的元素(线性搜索) |
FindLast(T) |
从尾部开始查找第一个匹配的元素 | |
| 属性 | First |
获取第一个节点(LinkedListNode<T>) |
Last |
获取最后一个节点 | |
Count |
获取节点数量(O(1) 时间复杂度) | |
| 判断 | Contains(T) |
判断值是否存在(内部调用 Find) |
二、哈希表
1.HashSet<T>
基于哈希表的数学集合,只存储唯一元素,没有对应的值。
| 方法 | 说明 |
|---|---|
Add(T item) |
添加元素,返回 bool(true 表示原本不存在,添加成功) |
Remove(T item) |
移除元素,返回 bool |
Contains(T item) |
快速判断元素是否存在 |
Clear() |
清空 |
| 集合操作 | UnionWith(并集)、IntersectWith(交集)、ExceptWith(差集)、SymmetricExceptWith(对称差集) |
| 子集/超集 | IsSubsetOf, IsSupersetOf, Overlaps 等 |
2.Dictionary<T>
查找、插入、删除的平均时间复杂度 O(1)
| 分类 | 方法 / 属性 | 说明 |
|---|---|---|
| 添加 | Add(TKey key, TValue value) |
添加键值对。若键已存在,抛出 ArgumentException |
TryAdd(key, value) |
(.NET Core 2.0+) 尝试添加,成功返回 true,键重复返回 false |
|
| 索引器 | this[key] |
获取或设置值。若键不存在,获取时抛出 KeyNotFoundException;设置时会添加或覆盖 |
| 查找 | ContainsKey(key) |
判断键是否存在 |
TryGetValue(key, out value) |
推荐,同时获取值,避免二次查找。存在返回 true,否则 false |
|
ContainsValue(value) |
判断值是否存在(O(n) 遍历,不常用) | |
| 删除 | Remove(key) |
移除指定键,返回 bool |
Clear() |
清空所有元素 | |
| 读取键/值 | Keys 属性 |
获取包含所有键的 KeyCollection(可遍历) |
Values 属性 |
获取包含所有值的 ValueCollection |
|
| 遍历 | foreach (KeyValuePair<TKey, TValue> kvp in dict) |
遍历所有键值对 |
| 容量管理 | Count |
当前元素个数 |
Capacity |
内部数组大小(不开放直接设置,但有 EnsureCapacity) |
|
TrimExcess() |
缩减容量到接近 Count,节省内存 |
三、栈
栈(Stack)是一种后进先出(LIFO, Last-In-First-Out) 的数据结构。在 C# 中,主要使用泛型版本Stack<T>。
| 方法 | 说明 | 时间复杂度 |
|---|---|---|
Push(T item) |
将元素压入栈顶 | O(1) 平均 |
Pop() |
移除并返回栈顶元素;若栈空则抛出 InvalidOperationException |
O(1) |
Peek() |
返回栈顶元素但不移除;若栈空则抛异常 | O(1) |
TryPop(out T result) |
尝试弹出,成功返回 true 且 result 为栈顶值,否则 false |
O(1) |
TryPeek(out T result) |
尝试查看,成功返回 true,否则 false (不抛出异常) |
O(1) |
Contains(T item) |
判断元素是否在栈中(线性搜索) | O(n) |
Clear() |
清空所有元素 | O(n) |
ToArray() |
将栈复制到新数组(顺序:栈顶到栈底) | O(n) |
TrimExcess() |
缩减容量到接近实际元素数,节省内存 | O(n) |
属性 Count |
获取栈中包含的元素个数 | O(1) |
四、队列
1.Queue
队列是一种先进先出的数据结构。
| 方法 | 说明 | 时间复杂度 |
|---|---|---|
Enqueue(T item) |
将元素添加到队列末尾 | O(1) 平均 |
Dequeue() |
移除并返回队首元素;若队列空,抛出 InvalidOperationException |
O(1) |
Peek() |
返回队首元素但不移除;队列空时抛异常 | O(1) |
TryDequeue(out T result) |
尝试出队,成功返回 true,否则 false(推荐) |
O(1) |
TryPeek(out T result) |
尝试查看队首,成功返回 true,否则 false |
O(1) |
Contains(T item) |
判断元素是否在队列中(线性搜索) | O(n) |
Clear() |
清空所有元素 | O(n) |
ToArray() |
复制队列到新数组(顺序:队首到队尾) | O(n) |
TrimExcess() |
缩减容量到接近实际元素数 | O(n) |
属性 Count |
获取元素个数 | O(1) |
2.优先队列(PriorityQueue)
| 方法 | 说明 | 时间复杂度 |
|---|---|---|
Enqueue(TElement element, TPriority priority) |
将元素与优先级一起入队 | O(log n) |
EnqueueRange(...) |
批量入队(多个元素或键值对) | O(k log n) |
Dequeue() |
移除并返回优先级最高的元素;队列空时抛异常 | O(log n) |
TryDequeue(out TElement element, out TPriority priority) |
同时取出元素和优先级;成功返回 true |
O(log n) |
Peek() |
返回优先级最高的元素(不移除),队列空抛异常 | O(1) |
TryPeek(...) |
尝试查看,安全版本 | O(1) |
Clear() |
清空队列 | O(n) |
属性 Count |
获取元素个数 | O(1) |
UnorderedItems |
返回不按优先级排序的集合(用于遍历所有元素) | O(1) 迭代器 |
优先队列可以用来实现堆排序
// 降序排序(使用最大堆:将优先级取负)
static int[] HeapSortDescending(int[] source)
{
var pq = new PriorityQueue<int, int>();
foreach (var num in source)
{
// 用 -num 作为优先级,则数值大的反而优先级高(负值小)
pq.Enqueue(num, -num);
}
int[] result = new int[source.Length];
int index = 0;
while (pq.Count > 0)
{
result[index++] = pq.Dequeue();
}
return result;
}
更多推荐
所有评论(0)