一、列表

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) 在指定节点之前插入

AddAfter(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) 添加元素,返回 booltrue 表示原本不存在,添加成功)
Remove(T item) 移除元素,返回 bool
Contains(T item) 快速判断元素是否存在
Clear() 清空
集合操作 UnionWith(并集)、IntersectWith(交集)、ExceptWith(差集)、SymmetricExceptWith(对称差集)
子集/超集 IsSubsetOfIsSupersetOfOverlaps 等

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;
    }

更多推荐