C# ArrayList 动态数组详解:增删查改全攻略

一颗松果
一颗松果
发布时间:2026-10-13 | 4人浏览过
原创

了解 C# 中 System.Collections.ArrayList 的完整操作流程。

结果或目标

ArrayList 是 C# 中用于管理可变大小对象集合的非泛型数据结构。它位于 System.Collections 命名空间下,支持通过索引访问元素(从零开始),允许添加重复项,并能自动在运行时调整容量以容纳新元素。由于它是非泛型的,存储的元素类型为 object,因此在读取特定类型时通常需要进行转换。

准备条件

  1. 环境要求:任何支持 C# 的开发环境(Visual Studio, VS Code, .NET CLI 等)。
  2. 命名空间引用:必须在文件头部显式添加 using System.Collections; 否则编译器无法识别 ArrayList 类。
  3. 基础认知:理解基本数据类型的装箱/拆箱概念,因为 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()。

动作与参数说明:

  1. 按值移除 (Remove(object value)):从列表开头搜索第一个匹配的元素并将其移除。如果找不到匹配项,列表保持不变。
  2. 按索引移除 (RemoveAt(int index)):移除指定位置(int 类型,从零开始)的元素。后续元素会自动向前移动填补空缺。
  3. 按范围移除 (RemoveRange(int index, int count)):从指定 index 开始,连续移除 count 个元素。
  4. 全部清空 (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()。

动作与规则:

  1. 正向查找 (IndexOf(object value)):从前向后搜索,返回首次出现的索引;若未找到,返回 -1。适用于无序或部分有序列表。
  2. 反向查找 (LastIndexOf(object value)):从后向前搜索,返回最后一次出现的索引;若未找到,返回 -1。
  3. 二分查找 (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# 集合操作的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表