ArrayList类是一个常用的集合类型,通俗地讲,可以将ArrayList看作是一个数组和集合的结合体。ArrayList既有数组的某些性质,又有集合的部分功能,因此使用非常方便。本部分将介绍ArrayList类的创建、其元素的添加、插入、删除及其排序、查找和遍历等。
与数组相比ArrayList类具有以下优点。
(1)数组的容量是固定的,而ArrayList的容量可根据需要自动扩充。如果更改了Capacity属性的值,则可以自动进行内存重新分配和元素复制。
(2)ArrayList提供添加、插入或移除某一范围元素的方法。在数组中,只能一次获取或设置一个元素的值。
(3)ArrayList提供将只读和固定大小包装返回到集合的方法;而数组不提供。
创建ArrayList时有两种方法,一种是显式的给出ArrayList的容量大小,另外一种则无需给出。下面的代码创建了一个容量大小为7的ArrayList类型变量a:
ArrayList a = new ArrayList(7);
如下的代码则在创建ArrayList时没有给出其容量大小:
ArrayList b = new ArrayList();
ArrayList最常用的两个属性为Capacity和Count。其中Capacity为ArrayList的容量,而Count为ArrayList中元素的个数。
下面介绍一个实例,演示Capacity和Count的使用方法。在使用ArrayList等集合类型时,必须添加对System.Collections的引用,即如下语句:
using System.Collections;
创建一个Windows控制台应用程序,创建ArrayList并演示其Capacity和Count属性的用法。
(1)创建一个名为ArrLstCommon的控制台应用程序项目。
(2)修改Program.cs文件中Main方法的内容如下:
static void Main(string[] args)
{
ArrayList a = new ArrayList(7);
//输出其容量
Console.WriteLine("a容量: {0}", a.Capacity);
//输出其元素个数
Console.WriteLine("a元素个数: {0}", a.Count);
ArrayList b = new ArrayList();
//输出其容量
Console.WriteLine("b容量: {0}", b.Capacity);
//输出其元素个数
Console.WriteLine("b元素个数: {0}", b.Count);
}
按Ctrl+F5组合键运行程序,运行结果如图5-1所示。
图5-1 运行结果
ArrayList类型变量a在创建时给出了其容量大小为7,因此创建后输出其容量大小为7。由于此时这是一个空的ArrayList,因此其元素个数为0。而变量b在创建时没有给出其容量大小,因此两项输出都为0。
与数组相比,添加元素是集合类型更方便的功能之一。数组一旦被创建,其大小就已经固定,此时即不能增加其元素,也不能减少其元素。即便使用数组自身提供的Clear方法,也只能是使其元素的值改变为初始值。
在数组中实现添加的功能必须新建另外一个长度更大的数组,并将原数组的内容原样复制,然后再给新数组中末尾的元素赋新的值。ArrayList则提供了添加元素的方法,即可以随意向ArrayList的末尾添加新的元素,该方法为Add。
ArrayList中可以添加任意类型的元素,也可以只添加一种类型的元素。下面通过一个实例演示如何向ArrayList中添加元素。
创建一个Windows控制台应用程序,演示如何向ArrayList中添加元素。
(1)创建一个名为ArrLstAdd的控制台应用程序项目。
(2)修改Program.cs文件中Main方法的内容如下:
static void Main(string[] args)
{
ArrayList a = new ArrayList(5);
a.Add("Thank");
a.Add("You");
Console.WriteLine("a容量:{0}",a.Capacity);
Console.WriteLine("a元素个数:{0}",a.Count);
a.Add(1);
a.Add(2);
a.Add(3);
a.Add(4);
a.Add(5);
Console.WriteLine("a容量:{0}", a.Capacity);
Console.WriteLine("a元素个数:{0}", a.Count);
}
按Ctrl+F5组合键运行程序,运行结果如图5-2所示。
图5-2 运行结果
首先,向ArrayList类型变量a中添加两个字符串变量,输出其容量和大小时分别为5和2。然后,又向a中添加了非字符串类型变量,即1、2、3、4和5,再输出其容量和大小时分别为10和7。可以看到,ArrayList会根据添加变量的多少自动增加其容量,并且对添加的元素没有类型上的限制。
ArrayList中的Add方法用于向集合的末尾插入一个元素,若要向ArrayList中其他的位置上插入一个元素,则需使用Insert方法。使用Insert方法时要注意需指定插入的位置,其他与Add方法类似,此处不再赘述
下面介绍一个实例,演示如何向ArrayList中插入元素。
创建一个Windows控制台应用程序,使用Insert方法向ArrayList中插入元素。
(1)创建一个名为ArrLstInsert的控制台应用程序项目。
(2)修改Program.cs文件中Main方法的内容如下:
static void Main(string[] args)
{
ArrayList a = new ArrayList();
//添加两个元素
a.Add("Thank");
a.Add("You");
//在位置1处连续插入5个元素
a.Insert(1, 5);
a.Insert(1, 4);
a.Insert(1, 3);
a.Insert(1, 2);
a.Insert(1, 1);
//输出
for (int i = 0; i < 7; i++)
{
Console.WriteLine(a[i]);
}
}
按Ctrl+F5组合键运行程序,运行结果如图5-3所示。
图5-3 运行结果
首先,向ArrayList类型变量a中添加两个字符串变量,分别是“Thank”和“You”。然后,向ArrayList的位置1处插入了5个整型数值变量,分别是1、2、3、4和5。从结果中可以看到,这5个数组被插入到“Thank”和“You”之间。
与数组不能任意地添加或删除其中的元素不同,ArrayList既可以通过Add添加元素,也可以使用Insert插入元素。同时,ArrayList也可以删除其中的元素。在ArrayList所提供的方法中,有Clear、Remove和RemoveAt三个方法与元素的删除有关,下面一一说明。Clear方法用于清除ArrayList中所有的元素。
创建一个Windows控制台应用程序,使用Clear方法清除ArrayList中的元素。
(1)创建一个名为ArrLstClear的控制台应用程序项目。
(2)修改Program.cs文件中Main方法的内容如下:
static void Main(string[] args)
{
ArrayList a = new ArrayList();
//在位置1处连续插入5个元素
a.Add(5);
a.Add(4);
a.Add(3);
a.Add(2);
a.Add(1);
//输出
for (int i = 0; i < 5; i++)
{
Console.WriteLine(a[i]);
}
//清除
a.Clear();
Console.WriteLine("a的元素个数:{0}", a.Count);
}
按Ctrl+F5组合键运行程序,运行结果如图5-4所示。
图5-4 运行结果
首先,向ArrayList类型变量a中添加几个整型元素,然后通过使用Clear方法将其全部清除。从输出中可以看到,使用Clear方法后,ArrayList的元素个数为0。
第二个比较常用的方法是Remove方法,Remove方法用于清除ArrayList中的某个元素,使用时需已知该元素。下面通过一个实例演示Remove方法的使用。
创建一个Windows控制台应用程序,使用Remove方法删除ArrayList中的元素。
(1)创建一个名为ArrLstRemove的控制台应用程序项目。
(2)修改Program.cs文件中Main方法的内容如下:
static void Main(string[] args)
{
ArrayList a = new ArrayList();
//在位置1处连续插入5个元素
a.Add(5);
a.Add(4);
a.Add(3);
a.Add(2);
a.Add(1);
//输出
for (int i = 0; i < 5; i++)
{
Console.WriteLine(a[i]);
}
//清除
a.Remove(3);
Console.WriteLine("a的元素个数:{0}", a.Count);
}
按Ctrl+F5组合键运行程序,运行结果如图5-5所示。
图5-5 运行结果
首先,向ArrayList类型变量a中添加几个整型元素,然后通过使用Remove方法将元素3从ArrayList中删除。从输出中可以看到,使用Remove方法后,ArrayList的元素个数为4。
第三个比较常用的方法是RemoveAt方法,该方法无需已知要删除的元素,只需知道其在ArrayList中的位置即可。
下面介绍一个实例,演示RemoveAt方法的使用。
创建一个Windows控制台应用程序,使用RemoveAt方法删除ArrayList中的元素。
(1)创建一个名为ArrLstRemoveAt的控制台应用程序项目。
(2)修改Program.cs文件中Main方法的内容如下:
static void Main(string[] args)
{
ArrayList a = new ArrayList();
//在位置1处连续插入5个元素
a.Add(5);
a.Add(4);
a.Add(3);
a.Add(2);
a.Add(1);
//输出
for (int i = 0; i < 5; i++)
{
Console.WriteLine(a[i]);
}
//清除
a.RemoveAt(2);
Console.WriteLine("a的元素个数:{0}", a.Count);
}
按Ctrl+F5组合键运行程序,运行结果如图5-6所示。
图5-6 运行结果
首先,向ArrayList类型变量a中添加几个整型元素,然后通过使用RemoveAt方法将ArrayList中第2个元素删除。从输出中可以看到,使用RemoveAt方法后,ArrayList的元素个数为4。
ArrayList中提供了简便的排序方法,同数组中的排序方法使用基本类似。在ArrayList中排序的方法也叫做Sort方法,下面通过一个实例演示其用法。
创建一个Windows控制台应用程序,使用Sort方法对ArrayList中的元素进行排序。
(1)创建一个名为ArrLstSort的控制台应用程序项目。
(2)修改Program.cs文件中Main方法的内容如下:
static void Main(string[] args)
{
ArrayList a = new ArrayList();
//在位置1处连续插入5个元素
a.Add(35);
a.Add(44);
a.Add(33);
a.Add(12);
a.Add(17);
//输出
Console.WriteLine("排序前:");
for (int i = 0; i < 5; i++)
{
Console.WriteLine(a[i]);
}
//清除
a.Sort();
//输出
Console.WriteLine("排序后:");
for (int i = 0; i < 5; i++)
{
Console.WriteLine(a[i]);
}
}
按Ctrl+F5组合键运行程序,运行结果如图5-7所示。
图5-7 运行结果
首先,向ArrayList类型变量a中添加几个任意排列的整型元素,然后通过使用Sort方法对ArrayList中的元素进行排序。从输出中可以看到,使用Sort方法后,ArrayList的元素排列为从小到大。
与数组一样,ArrayList中也存在元素的查找问题。ArrayList中提供了两个方法,分别是IndexOf和LastIndexOf。IndexOf用于查找该元素首次在ArrayList中出现的位置,而LastIndexOf用于查找该元素最后一次在ArrayList中出现的位置。
下面介绍一个实例,演示IndexOf和LastIndexOf的用法。
创建一个Windows控制台应用程序,演示在ArrayList中查找元素的方法。
(1)创建一个名为ArrLstSearch的控制台应用程序项目。
(2)修改Program.cs文件中Main方法的内容如下:
static void Main(string[] args)
{
ArrayList a = new ArrayList();
a.Add(1);
a.Add(2);
a.Add(3);
a.Add(2);
a.Add(1);
for (int i = 0; i < 5; i++)
{
Console.WriteLine(a[i]);
}
int b = a.IndexOf(1);
int c = a.LastIndexOf(1);
int d = a.IndexOf(3);
int e = a.LastIndexOf(3);
Console.WriteLine("元素1首次出现:{0}", b);
Console.WriteLine("元素1最后一次出现:{0}", c);
Console.WriteLine("元素3首次出现:{0}", d);
Console.WriteLine("元素3最后一次出现:{0}", e);
}
按Ctrl+F5组合键运行程序,运行结果如图5-8所示。
图5-8 运行结果
显然,在实例的ArrayList中元素“1”出现了两次,因此使用IndexOf和LastIndexOf所得的结果是不同的,而元素“3”只出现了一次,因此使用IndexOf和LastIndexOf所得的结果是相同的。
遍历ArrayList中的所有元素有很多方法,这里仅介绍两种比较常用的方法,分别是for循环和foreach语句。其使用方法与数组类似,下面通过实例进行说明。
创建一个Windows控制台应用程序,演示遍历ArrayList中所有元素的方法。
(1)创建一个名为ArrLstAll的控制台应用程序项目。
(2)修改Program.cs文件中Main方法的内容如下:
static void Main(string[] args)
{
ArrayList a = new ArrayList();
a.Add(1);
a.Add(2);
a.Add(3);
a.Add(2);
a.Add(1);
//方法1
Console.WriteLine("方法1:");
for (int i = 0; i < 5; i++)
{
Console.WriteLine(a[i]);
}
//方法2
Console.WriteLine("方法2:");
foreach(int i in a)
{
Console.WriteLine(i);
}
}
按Ctrl+F5组合键运行程序,运行结果如图5-9所示。
图5-9 运行结果
可以看到,两种方法都给出了同样的结果。
ArrayList和数组非常相似,使用时经常会将ArrayList转换为数组进行一些操作。在C#中,将ArrayList转换为数组非常方便,只需使用ArrayList.ToArray方法即可。下面介绍一个实例,演示两者之间的转换。
创建一个Windows控制台应用程序,演示将ArrayList转换为数组的方法。
(1)创建一个名为ArrLstConvert的控制台应用程序项目。
(2)修改Program.cs文件中Main方法的内容如下:
static void Main(string[] args)
{
ArrayList a = new ArrayList();
a.Add(1);
a.Add(2);
a.Add(3);
a.Add(4);
a.Add(5);
int[] b = new int[5];
b = (int[])a.ToArray(typeof(int));
foreach (int i in b)
{
Console.WriteLine(i);
}
}
按Ctrl+F5组合键运行程序,运行结果如图5-10所示。
图5-10 运行结果
可以看到,ArrayList类型变量a中的元素被原样复制到数组b中。