C# ArrayList 动态数组详解:增删查改全攻略
了解 C# 中 System.Collections.ArrayList 的完整操作流程。
结果或目标
ArrayList 是 C# 中用于管理可变大小对象集合的非泛型数据结构。它位于 System.Collections 命名空间下,支持通过索引访问元素(从零开始),允许添加重复项,并能自动在运行时调整容量以容纳新元素。由于它是非泛型的,存储的元素类型为 object,因此在读取特定类型时通常需要进行转换。
准备条件
- 环境要求:任何支持 C# 的开发环境(Visual Studio, VS Code, .NET CLI 等)。
- 命名空间引用:必须在文件头部显式添加
using System.Collections;否则编译器无法识别ArrayList类。 - 基础认知:理解基本数据类型的装箱/拆箱概念,因为
ArrayList会隐式将值类型转换为对象类型进行存储。
真实操作顺序
第1步:实例化与初始化
目的:创建动态数组对象并指定初始容量(可选)。
入口:调用 new ArrayList() 构造函数。
动作:
- 默认无参构造:
var list = new ArrayList();,初始容量为 0,随后按需增长。 - 指定容量构造:
var list = new ArrayList(int capacity);,预分配一定数量的内存空间以提升性能。
参数:capacity 为整数,表示初始容量。
第2步:添加元素 (Add & AddRange)
目的:向列表尾部追加单个或批量元素。
入口:使用 Add() 和 AddRange() 方法。
动作:
以下代码展示了如何构建一个包含多种类型(字符串、整数)的动态数组:
using System;
using System.Collections; // 必须引用
namespace DynamicArrayExample
{
class Program
{
static void Main(string[] args)
{
// 1. 初始化,指定初始容量为3
ArrayList al = new ArrayList(3);
Console.WriteLine($"未添加前al的元素个数为:{al.Count}");
// 2. 使用 Add 逐个添加元素
al.Add("abc");
al.Add("xyz");
al.Add("opq");
Console.WriteLine($"调用Add方法后al的元素个数为:{al.Count}");
// 3. 使用 AddRange 批量添加数组内容
string[] last = { "def", "ghj" };
al.AddRange(last);
Console.WriteLine($"调用AddRange方法后al的元素个数为:{al.Count}");
// 4. 遍历输出验证
foreach (string item in al)
{
Console.WriteLine(item);
}
Console.ReadLine();
}
}
}
可观察的完成状态:Count 属性随添加操作线性增加;控制台依次打印出所有已添加元素。
第3步:删除元素 (Remove, RemoveAt, RemoveRange, Clear)
目的:根据值、索引、范围或全部清除数据。
入口:Remove(), RemoveAt(), RemoveRange(), Clear()。
动作与参数说明:
- 按值移除 (
Remove(object value)):从列表开头搜索第一个匹配的元素并将其移除。如果找不到匹配项,列表保持不变。 - 按索引移除 (
RemoveAt(int index)):移除指定位置(int类型,从零开始)的元素。后续元素会自动向前移动填补空缺。 - 按范围移除 (
RemoveRange(int index, int count)):从指定index开始,连续移除count个元素。 - 全部清空 (
Clear()):移除列表中所有的元素,并将Count置为 0。
实战代码:
static void DeleteElements()
{
ArrayList al = new ArrayList();
// 填充数据
al.Add("abc");
al.Add(50); // 注意:混合类型存入
al.Add(10);
al.Add("def");
al.Add("ghj");
Console.WriteLine("原始个数: " + al.Count);
// 1. 删除索引为2的元素 (值为 10)
al.RemoveAt(2);
Console.WriteLine("删除索引为2后个数: " + al.Count);
// 2. 删除第一个值为 "abc" 的项
al.Remove("abc");
Console.WriteLine("删除值abc后个数: " + al.Count);
// 3. 从索引1开始,删除2个元素
al.RemoveRange(1, 2);
Console.WriteLine("删除范围后剩余: " + al.Count);
// 此时列表中仅剩下一个元素
foreach (var item in al)
{
Console.WriteLine(item);
}
}
第4步:查找元素 (IndexOf, LastIndexOf, BinarySearch)
目的:定位元素在列表中的位置索引。
入口:IndexOf(), LastIndexOf(), BinarySearch()。
动作与规则:
- 正向查找 (
IndexOf(object value)):从前向后搜索,返回首次出现的索引;若未找到,返回 -1。适用于无序或部分有序列表。 - 反向查找 (
LastIndexOf(object value)):从后向前搜索,返回最后一次出现的索引;若未找到,返回 -1。 - 二分查找 (
BinarySearch(object value)):**前提是该 ArrayList 必须是排序过的**。它使用对数时间复杂度查找,效率高但限制严格。如果列表未排序,结果不可预测。同样,找不到返回负值。
实战代码:
static void SearchElements()
{
// 初始化一个已经排好序的集合用于演示 BinarySearch
string[] str = { "a", "b", "c", "d", "d", "e", "f" };
ArrayList al = new ArrayList(str);
// 1. 查找 "c" 的首次出现位置
int i = al.IndexOf("c");
Console.WriteLine($"元素c在集合中的位置是:{i}");
// 2. 查找 "d" 的最后一次出现位置
i = al.LastIndexOf("d");
Console.WriteLine($"元素d在集合中的位置是:{i}");
// 3. 二分查找 "f" (需确保列表有序)
int j = al.BinarySearch("f");
if (j >= 0) // 注意:BinarySearch可能返回负数或非正数,这里仅判断是否找到
{
Console.WriteLine($"元素f在数组的位置是:{j}");
}
else
{
Console.WriteLine("没有找到");
}
}
第5步:遍历集合
目的:读取列表中的所有数据。
动作:
- 推荐方式 (
foreach):最安全且简洁的方式,无需关心索引边界。foreach (object item in al) { ... } - 数值迭代 (
for或while):需要处理索引0到al.Count - 1。注意在遍历时修改集合会导致异常,应谨慎操作。
完成判断
当能够正确使用 Add/Remove/BinarySearch 等方法操作数据,且程序输出符合预期索引和计数逻辑时,即表明已掌握 C# ArrayList 的基础应用。需注意其作为非泛型集合的性能开销及类型安全性问题,在实际现代开发中,除非为了兼容极老代码库,否则推荐使用泛型 List<T>。
简要总结
System.Collections.ArrayList 提供了灵活的动态数组功能,支持基于值的查找与基于索引的随机访问。其核心在于理解索引机制以及不同删除方法的副作用。虽然在现代 C# 开发中逐渐被泛型取代,但在处理遗留系统或特定非类型强约束场景下仍具有实用价值。以上就是 C# 的 ArrayList 类的详细内容,更多关于 C# 集合操作的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









