本文参考自《C#入门经典(第八版)》
我们知道的普通数组System.Array类实际上是集合类(Collection Class)的一种类型。集合类一般用于处理对象列表,其功能比简单数组要多,功能大多是通过实现System.Collections名称空间中的接口而获得的。而System.Collections.ArrayList类(以下简称ArrayList类)就是这样一种类,可以实现比Array类更多的功能。
//在vs中通过按住Alt左键点击ArrayList可以看到
namespace System.Collections
{
public class ArrayList : IList, ICollection, IEnumerable, ICloneable
{
......
}
}
可以看到ArrayList类使用了IList, ICollection, IEnumerable, ICloneable这四个接口。这几个接口定义在System.Collections名称空间下。这些接口为类提供了基本的集合功能。
在说明ArrayList的功能之前,有必要了解一下这几个接口。
ArrayList类实现了上述接口,但实现方式比System.Array类更复杂。这个类可用于表示可变大小的数组(或者称为集合)。接下来将简单介绍使用方法。
使用ArrayList前,需要添加System.Collections名称空间。
using System.Collections;
#####创建一个ArrayList
ArrayList的构造函数有三个重载,下面逐一说明。
默认的构造函数是这样的:
ArrayList arrayListTest = new ArrayList();
可以发现,ArrayList不像普通数组那样需要指定数组的大小。
第二个构造函数:
ArrayList arrayListTest = new ArrayList(5);
//这样创建的ArrayList默认有五个元素的容量,但这并不是绝对容量。
第三个构造函数是这样的:
public ArrayList(ICollection c);
//初始化 System.Collections.ArrayList 类的新实例,该类包含从指定集合复制的元素,并具有与复制的元素数相同的初始容量。
//参数c:其元素已复制到新列表的 System.Collections.ICollection。
可以看到c是一个ICollection类型的变量。也就是说,使用了ICollection接口的类的实例都可以当做参数c(没错,普通数组Array也可以,因为Array也使用了ICollection接口)。
所以我们可以这么用:
ArrayList arrayListTest2 = new ArrayList(arrayListTest);
//这样创建直接复制了arrayListTest集合
还可以这么用:
int[] intTest = new int[5] { 1, 2, 3, 4, 5 };
ArrayList arrayListTest2 = new ArrayList(intTest);
#####给ArrayList添加元素
不像普通数组定义出来后就有了大小,ArrayList刚创建时是空的(一个元素都没有,除非你不是用的默认构造函数)。那么我们就需要给ArrayList添加元素了。添加元素需要使用ArrayList里的一个方法:
public virtual int Add(object value);
//将value对象添加到ArrayList的结尾处。返回值为添加到ArrayList里的value的索引。
使用示例:
ClassTest classTestObject = new ClassTest();
arrayListTest.Add(classTestObject);
或者把以上两行代码二合一:
arrayListTest.Add(new ClassTest());
Add()方法只能在末尾添加一个元素。因此可以使用另一个方法一次性添加多个元素:
public virtual void AddRange(ICollection c);
//将 ICollection 的元素添加到 System.Collections.ArrayList 的末尾。
ICollection接口已在上文介绍,这里不再赘述。
给ArrayList添加元素后,ArrayList的长度(容量)就会自动增加。但是和Array不一样的是,读取ArrayList的长度需要使用ArrayList的Count属性。
Console.WriteLine(arrayListTest.Count);
//将 System.Collections.ICollection 的元素添加到 System.Collections.ArrayList 的末尾。
#####使用ArrayList中的元素
添加完元素后,就可以使用里面的元素了。ArrayList可以像Array一样直接用下标索引使用元素。
ClassTest classTestObject2 = new ClassTest();
arrayListTest[1] = classTestObject2;
当然,索引ArrayList的下标也不能越界。
在使用ArrayList里的对象时,要注意:ArrayList集合是System.Object对象的集合,因此在使用对象成员时需要进行类型转换:
((ClassTest)arrayListTest[0]).FunctionTest();
//FunctionTest()方法定义在ClassTest中。
#####删除ArrayList中的元素
使用如下方法可以删除ArrayList中的特定索引值的元素:
arrayListTest.RemoveAt(0);
//将删除下标为0的元素
还可以使用:
arrayListTest.Remove(classTestObject);
//删除arrayTest中的classTestObject对象
删除某些元素后,这些元素后面的元素会自动前移。所以务必注意越界问题。