C# 集合

ArrayList
ArrayList是一个动态的数组。其可存储的元素类型为object,也就是说它可以存储任何类型的对象。所有元素都被视为 object 类型。因而值类型被存储到ArrayList中会被装箱成为引用类型。实际上,ArrayList内部也就是使用一个object[]来存放元素。
与数组相比,ArrayList的优点在于可以动态调节大小,存储的元素类型可以不一致。
但缺点就在于对于存取值类型来说,需要进行装箱和拆箱操作,带来性能上的开销。
除了元素数量外,ArrayList还有一个 容量 (capacity) 的概念,这个容量是ArrayList内object[]的实际长度,而Count是object[]中元素的数量。
当对ArrayList进行添加操作时,添加的元素数量一旦超过容量,容量会翻倍并创建一个新的object[],将原object[]通过Array.Copy()拷贝到新数组中,最后将需要添加的元素也拷贝进这个新object[]中。
创建 ArrayList 实例
1 | // 创建一个 Count = 0, Capacity = 0 的 ArrayList 实例 |
属性
1 | ArrayList arr = new ArrayList(new int[] { 1, 2, 3 }); |
方法
1 | ArrayList arr = new ArrayList(new int[]{1,2,3}); |
1 | // 该例子来自于Microsoft Learn C# API System.IComparer 接口中 |
使用 Array.FindAll() 寻找元素
1 | Object[] o = Array.FindAll(stuList.ToArray(), item => |
List
List<T> 是 C# 中常用的泛型集合类型,提供了动态数组的功能。它位于 System.Collections.Generic 命名空间中,能够自动调整大小,提供高效的元素访问和操作。
与ArrayList相比,List<T>只能同时存放一种类型,避免了装箱和拆箱的开销,而且在获取元素时不需要进行类型转换。因此,除非必须处理不同类型的对象,一般使用 List<T>。
创建List实例
1 | // 创建一个 Count = 0, Capacity = 0 的 List<int> 实例 |
属性
List<T>可以使用的使用的属性与ArrayList一致。
| Capacity | 获取或设置该内部数据结构在不调整大小的情况下能够容纳的元素总数。 |
|---|---|
| Count | 获取 List 中包含的元素数。 |
| Item[Int32] | 获取或设置指定索引处的元素。 |
方法
List<T>可以使用的方法几乎与ArrayList一致。
这里仅列出常用的方法
此表从 MicroSoft Learn C# API List 复制而来,有删减。
| 方法名 | 描述 |
|---|---|
| Add(T) | 将对象添加到 List 的结尾处。 |
| AddRange(IEnumerable) | 将指定集合的元素添加到 List 的末尾。 |
| AsReadOnly() | 返回当前集合的只读 ReadOnlyCollection 包装器。 |
| Clear() | 从 List 中移除所有元素。 |
| Contains(T) | 确定某元素是否在 List中。 |
| ConvertAll(Converter) | 将当前 List中的元素转换为另一种类型,并返回包含已转换元素的列表。 |
| CopyTo(Int32, T], Int32, Int32) | 从目标数组的指定索引处开始,将元素的范围从 List 复制到兼容的一维数组。 |
| CopyTo(T]) | 从目标数组的开头开始,将整个 List 复制到兼容的一维数组。 |
| CopyTo(T], Int32) | 从目标数组的指定索引处开始,将整个 List 复制到兼容的一维数组。 |
| Exists(Predicate) | 确定 List 是否包含与指定谓词定义的条件匹配的元素。 |
| Find(Predicate) | 搜索与指定谓词所定义的条件相匹配的元素,并返回整个 List 中的第一个匹配元素。 |
| FindAll(Predicate) | 检索与指定谓词定义的条件匹配的所有元素。 |
| FindIndex(Int32, Int32, Predicate) | 搜索与指定谓词所定义的条件相匹配的一个元素,并返回 List 中从指定的索引开始、包含指定元素个数的元素范围内第一个匹配项的从零开始的索引。 |
| FindIndex(Int32, Predicate) | 搜索与指定谓词所定义的条件相匹配的元素,并返回 List 中从指定索引到最后一个元素的元素范围内第一个匹配项的从零开始的索引。 |
| FindIndex(Predicate) | 搜索与指定谓词所定义的条件相匹配的元素,并返回整个 List 中第一个匹配元素的从零开始的索引。 |
| FindLast(Predicate) | 搜索与指定谓词所定义的条件相匹配的元素,并返回整个 List 中的最后一个匹配元素。 |
| FindLastIndex(Int32, Int32, Predicate) | 搜索与指定谓词所定义的条件相匹配的元素,并返回 List 中包含指定元素个数、到指定索引结束的元素范围内最后一个匹配项的从零开始的索引。 |
| FindLastIndex(Int32, Predicate) | 搜索与由指定谓词定义的条件相匹配的元素,并返回 List 中从第一个元素到指定索引的元素范围内最后一个匹配项的从零开始的索引。 |
| FindLastIndex(Predicate) | 搜索与指定谓词所定义的条件相匹配的元素,并返回整个 List 中最后一个匹配元素的从零开始的索引。 |
| ForEach(Action) | 对 List 的每个元素执行指定操作。 |
| GetEnumerator() | 返回循环访问 List 的枚举数。 |
| GetRange(Int32, Int32) | 在源 List 中创建元素范围的浅表复制。 |
| IndexOf(T) | 搜索指定的对象,并返回整个 List 中第一个匹配项的从零开始的索引。 |
| IndexOf(T, Int32) | 搜索指定对象并返回 List 中从指定索引到最后一个元素这部分元素中第一个匹配项的从零开始索引。 |
| IndexOf(T, Int32, Int32) | 搜索指定对象并返回 List 中从指定索引开始并包含指定元素数的这部分元素中第一个匹配项的从零开始索引。 |
| Insert(Int32, T) | 将元素插入 List 的指定索引处。 |
| InsertRange(Int32, IEnumerable) | 将集合中的元素插入 List 的指定索引处。 |
| LastIndexOf(T) | 搜索指定对象并返回整个 List 中最后一个匹配项的从零开始索引。 |
| LastIndexOf(T, Int32) | 搜索指定对象并返回 List 中从第一个元素到指定索引这部分元素中最后一个匹配项的从零开始的索引。 |
| LastIndexOf(T, Int32, Int32) | 搜索指定对象并返回 List 中到指定索引为止包含指定元素数的这部分元素中最后一个匹配项的从零开始索引。 |
| Remove(T) | 从 List 中移除特定对象的第一个匹配项。 |
| RemoveAll(Predicate) | 移除与指定的谓词所定义的条件相匹配的所有元素。 |
| RemoveAt(Int32) | 移除 List 的指定索引处的元素。 |
| RemoveRange(Int32, Int32) | 从 List 中移除一系列元素。 |
| Reverse() | 将整个List 中元素的顺序反转。 |
| Reverse(Int32, Int32) | 将指定范围中元素的顺序反转。 |
| Sort() | 使用默认比较器对整个 List 中的元素进行排序。 |
| Sort(Comparison) | 使用指定的 Comparison ,对整个 List 中的元素进行排序。 |
| Sort(IComparer) | 使用指定的比较器对整个 List 中的元素进行排序。 |
| Sort(Int32, Int32, IComparer) | 使用指定的比较器对 List 中某个范围内的元素进行排序。 |
| ToArray() | 将 List 的元素复制到新数组中。 |
| TrimExcess() | 将容量设置为 List 中元素的实际数目(如果该数目小于某个阈值)。 |
| TrueForAll(Predicate) | 确定 List 中的每个元素是否都与指定谓词定义的条件匹配。 |
Dictionary
Dictionary<TKey, TValue> 是 C# 中一个常用的泛型集合,存储键值对(key-value pairs),并根据键快速查找值。
- 键值对存储:
Dictionary使用键值对的形式存储数据,其中每个键是唯一的,并映射到一个特定的值。
- 快速查找:
- 使用哈希表(hash table)实现,提供 O(1) 时间复杂度的快速查找、插入和删除操作。
- 键的唯一性:
- 键必须是唯一的。如果尝试添加一个已经存在的键,会抛出
ArgumentException。
- 键必须是唯一的。如果尝试添加一个已经存在的键,会抛出
- 泛型类型:
- 键和值可以是任何类型,由泛型参数
TKey和TValue指定。
- 键和值可以是任何类型,由泛型参数
在使用中,可以利用其键唯一的特性进行去重操作。
创建Dictionary 实例
1 | Dictionary<string,string> dict1 = new Dictionary<string, string>(); |
属性
Count:获取包含在Dictionary<TKey, TValue>中的键值对的数目。Keys:获取包含Dictionary<TKey, TValue>中的键的ICollection<TKey>。Values:获取包含Dictionary<TKey, TValue>中的值的ICollection<TValue>。this[key]:获取或设置与指定的键相关联的值。
1 | Dictionary<string,int> dict1 = new Dictionary<string, int>() |
方法
void Add(TKey key, TValue value):将指定的键和值添加到字典中。bool ContainsKey(TKey key):确定Dictionary<TKey, TValue>是否包含指定的键。bool ContainsValue(TValue value):确定Dictionary<TKey, TValue>是否包含指定的值。bool Remove(TKey key):从Dictionary<TKey, TValue>中移除具有指定键的值。bool TryGetValue(TKey key, out TValue value):获取与指定的键相关联的值。如果操作成功,返回true;否则,返回false。void Clear():从Dictionary<TKey, TValue>中移除所有键和值。
一些方法如Clear()也可用于 Dictionary。
示例
1 | using System; |
Queue
Queue<T> 是 C# 中的一个泛型集合类,用于表示先进先出(First In First Out)的一组对象。
创建Queue实例
1 | // 创建一个 Capacity = 0, Count = 0 的 Queue 实例 |
属性
Count:获取元素个数
1 | Queue<string> queue3 = new Queue<string>(new string[]{ "rzzy","RZZY","日之朝矣"}); |
方法
void Enqueue(T item):将对象添加到Queue<T>的末尾。T Dequeue():移除并返回位于Queue<T>开始处的对象。如果队列为空,会抛出InvalidOperationException。T Peek():返回位于Queue<T>开始处的对象但不将其移除。如果队列为空,会抛出InvalidOperationException。bool Contains(T item):确定某元素是否在Queue<T>中。void Clear():移除Queue<T>中的所有对象。T[] ToArray():将Queue<T>元素复制到新数组中。void TrimExcess():将容量设置为Count的实际元素数,如果元素数小于当前容量的 90%。
1 | Queue<string> queue3 = new Queue<string>(new string[]{ "rzzy","RZZY","日之朝矣"}); |
Stack
Stack<T> 是 C# 中的一个泛型集合类,用于表示后进先出(Last In First Out)的一组对象,与队列(Queue)正好相反。
创建Stack实例
1 | // 创建一个 Capacity = 0, Count = 0 的 Stack 实例 |
属性
1 | Stack<string> stack3 = new Stack<string>(new string[]{ "rzzy","RZZY","日之朝矣"}); |
方法
void Push(T item):将对象添加到Stack<T>的顶端。T Pop():移除并返回位于Stack<T>顶端的对象。如果堆栈为空,会抛出InvalidOperationException。T Peek():返回位于Stack<T>顶端的对象但不将其移除。如果堆栈为空,会抛出InvalidOperationException。bool Contains(T item):确定某元素是否在Stack<T>中。void Clear():移除Stack<T>中的所有对象。T[] ToArray():将Stack<T>元素复制到新数组中。void TrimExcess():将容量设置为Count的实际元素数,如果元素数小于当前容量的 90%。
1 | Stack<string> stack3 = new Stack<string>(new string[]{ "rzzy","RZZY","日之朝矣"}); |
参考内容
参考内容:
- 标题: C# 集合
- 作者: 日之朝矣
- 创建于 : 2024-07-31 19:23:15
- 更新于 : 2024-08-18 09:25:27
- 链接: https://blog.rzzy.fun/2024/07/31/csharp-collections/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。