集合类时专门用于数据存储和检索的类。这些类提供了对栈、队列、list和哈希表的支持。大多数集合类实现了相同的接口,
集合好比容器,将一系列相似的组合在一起,是一个特殊的类,和数组一样,可以通过索引访问集合成员,也可以通过“键”来访问,
集合可分为两类:泛型集合和非泛型集合
非泛型集合:动态数组、栈、队列、哈希表
泛型集合:Dictionary
是C#中提供的一种动态数组类,位于命名空间System.Collections中
动态数组与普通数组不同,它的大小可以动态调整,无需预先定义固定长度
动态数组代表了可被单独索引的对象的有序集合,他也允许在列表中进行动态内存分配、增加、搜索、排序各项
ArrayList
类适用于需要频繁调整大小的数组操作,但由于其非泛型特性,在现代 C# 开发中逐渐被 List
替代。
动态扩展:ArrayList的容量可以根据需要自动调整,不需要指定固定大小,当添加的元素超过当前容量时,ArrayList会自动增加容量(通常是原容量的两倍)
非泛型集合:所有的元素被存储为object类型。这意味着替他可以存储任意类型的对象,但需要注意(装箱和拆箱的性能影响
无序操作:虽然元素存储顺序与添加顺序一致,但它并不提供内置排序功能
线程安全:默认不是线程安全的,如果需要线程安全。如果需要线程安全的ArrayList,可以使用ArrayList.Synchronized方法生成一个线程安全的版本
注意:避免频繁的装箱和拆箱:如果数据主要是值类型,建议使用List
来避免性能开销 慎用混合类型数据:尽量不要混合存储不同类型的对象,以降低运行时错误的风险
替代方案:推荐使用泛型集合(List
\Dictionary )以提高代码的安全性和效率
List
Listnumbers = new List ();
可通过索引访问的强类型列表,可以对列表进行搜索、排序和相关操作
操作 | 方法 | 描述 |
---|---|---|
添加元素 | Add(T item) | 将对象添加到List中 |
AddRange(IEnumerable ) |
添加集合中的元素到List中 | |
插入元素 | Insert(int indedx, T item) | 在指定位置index插入元素item |
删除元素 | Remove(T item) | 移除指定对象,如果列表中有多个该对象,只会移除第一个 |
RemoveAt(int index) | 移除指定索引处的元素 | |
RemoveAll(Predicate |
移除所有匹配条件的元素 | |
Clear() | 移除所有元素 | |
查找元素 | Contains(T item) |
判断是否包含特定的对象 |
IndexOf(T item) |
返回对象的索引,如果列表中有多个该对象,只会返回第一个的索引 | |
FindIndex(Predicate |
返回匹配特定条件的元素的索引 | |
Find(Predicate |
返回匹配特定条件的第一个元素 | |
排序 | Sort() |
对列表进行排序 |
Reverse() |
反转列表中元素的顺序 | |
转换和复制 | ToArray() |
将List转换为数组 |
CopyTo(T[] array) |
将List中的元素复制到一个新的数组中 | |
统计和求和 | Sum(Func |
计算集合中元素的和 |
Average(Func |
计算集合中元素的平均值 |
注意:List是一个基于索引的集合,这意味着元素是按顺序存储的。List的容量可以动态增长,但如果需要增加容量,则会影响性能。使用List时,确保考虑内存消耗,因为他是存储在堆上的
特性 | ArrayList | List |
---|---|---|
类型安全 | 否(存储object类型) | 是(泛型,强类型约束) |
装箱与拆箱 | 是(值类型需要) | 否 |
性能 | 较低 | 较高 |
泛型支持 | 无 | 有 |
使用场景 | 遗留代码及简单场景 | 现代开发中优先选择 |