7.6 ArrayList类

视频讲解:光盘\TM\lx\7\06 ArrayList类.mp4

ArrayList类相当于一种高级的动态数组,它是Array类的升级版本,本节将对该类进行详细介绍。

7.6.1 ArrayList类概述

ArrayList类位于System.Collections命名空间下,它可以动态地添加和删除元素。可以将ArrayList类看作扩充了功能的数组,但它并不等同于数组。

与数组相比,ArrayList类为开发人员提供了以下功能。

数组的容量是固定的,而ArrayList的容量可以根据需要自动扩充。

ArrayList提供添加、删除和插入某一范围元素的方法,但在数组中,只能一次获取或设置一个元素的值。

ArrayList提供将只读和固定大小包装返回到集合的方法,而数组不提供。

ArrayList只能是一维形式,而数组可以是多维的。

说明 Array的长度是它可包含的元素总数。Array的秩是Array中的维数。Array中维度的下限是Array中该维度的起始索引,多维Array的各个维度可以有不同的界限。

ArrayList提供了3个构造器,通过这3个构造器可以有3种声明方式,下面分别介绍。

(1)默认的构造器,将会以默认的大小(16位)来初始化内部的数组。构造器格式如下。

        public ArrayList();

通过以上构造器声明ArrayList的语法格式如下。

        ArrayList List = new ArrayList();

List:ArrayList对象名。

【例7.22】声明一个ArrayList对象,并给其添加10个int类型的元素值,代码如下。

        ArrayListList=new ArrayList();
        for (int i=0; i<10; i++)   //给ArrayList对象添加10个int元素
            List.Add(i);

(2)用一个ICollection对象来构造,并将该集合的元素添加到ArrayList中。构造器格式如下。

        public ArrayList(ICollection);

通过以上构造器声明ArrayList的语法格式如下。

        ArrayList List = new ArrayList(arryName);

List:ArrayList对象名。

arryName:要添加集合的数组名。

【例7.23】声明一个int类型的一维数组,然后声明一个ArrayList对象,同时将已经声明的一维数组中的元素添加到该对象中,代码如下。

        int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        ArrayListList=new ArrayList(arr);

(3)用指定的大小初始化内部的数组。构造器格式如下。

        public ArrayList(int);

通过以上构造器声明ArrayList的语法格式如下。

        ArrayList List = new ArrayList(n);

List:ArrayList对象名。

n:ArrayList对象的空间大小。

【例7.24】声明一个具有10个元素的ArrayList对象,并为其赋初始值,代码如下。

        ArrayListList=new ArrayList(10);
        for (int i=0; i<List.Count; i++)            //给ArrayList对象添加10个int元素
            List.Add(i);

ArrayList常用属性及说明如表7.1所示。

表7.1 ArrayList常用属性及说明

7.6.2 ArrayList元素的添加

向ArrayList集合中添加元素时,可以使用ArrayList类提供的Add方法和Insert方法,下面对这两个方法进行详细介绍。

1.Add方法

Add方法用来将对象添加到ArrayList集合的结尾处,其语法格式如下。

        public virtual int Add(Object value)

value:要添加到ArrayList的末尾处的Object,该值可以为空引用。

返回值:ArrayList索引,已在此处添加了value。

说明 ArrayList允许null值作为有效值,并且允许重复的元素。

【例7.25】声明一个包含6个元素的一维数组,并使用该数组实例化一个ArrayList对象,然后使用Add方法为该ArrayList对象添加元素,代码如下。

        int[] arr = new int[] { 1, 2, 3, 4, 5, 6 };
        ArrayList List=new ArrayList(arr);          //使用声明的一维数组实例化一个ArrayList对象
        List.Add(7);                                //为ArrayList对象添加元素
2.Insert方法

Insert方法用来将元素插入ArrayList集合的指定索引处,其语法格式如下。

        public virtual void Insert (
            int index,
            Object value)

index:从零开始的索引,应在该位置插入value。

value:要插入的Object,该值可以为空引用。

说明 >如果ArrayList实际存储元素数已经等于ArrayList可存储的元素数,则会通过自动重新分配内部数组增加ArrayList的容量,并在添加新元素之前将现有元素复制到新数组中。

【例7.26】声明一个包含6个元素的一维数组,并使用该数组实例化一个ArrayList对象,然后使用Insert方法在该ArrayList对象的指定索引处添加一个元素,代码如下。

        nt[] arr = new int[] { 1, 2, 3, 4, 5, 6 };
        ArrayList List=new ArrayList(arr);              //使用声明的一维数组实例化一个ArrayList对象
        List.Insert(3, 7);                              //在ArrayList集合的指定位置添加一个元素

【例7.27】创建一个控制台应用程序,其中定义了一个int类型的一维数组,并使用该数组实例化一个ArrayList对象,然后分别使用ArrayList对象的Add方法和Insert方法向ArrayList集合的结尾处和指定索引处添加元素。程序代码如下。(实例位置:光盘\TM\sl\7\12)

        static void Main(string[] args)
        {
            int[] arr = new int[] { 1, 2, 3, 4, 5, 6 };
            ArrayListList=new ArrayList(arr);        //使用声明的一维数组实例化一个ArrayList对象
            Console.WriteLine("原ArrayList集合:");
            foreach (int i in List)                  //遍历ArrayList集合并输出
            {
              Console.Write(i + " ");
            }
            Console.WriteLine();
            for (int i = 1; i < 5; i++)
            {
              List.Add(i+arr.Length);                //为ArrayList集合添加元素
            }
            Console.WriteLine("使用Add方法添加:");
            foreach (int i in List)                  //遍历添加元素后的ArrayList集合并输出
            {
              Console.Write(i + " ");
            }
            Console.WriteLine();
            List.Insert(6, 6);                        //在ArrayList集合的指定位置添加元素
            Console.WriteLine("使用Insert方法添加:");
            foreach (int i in List)                   //遍历最后的ArrayList集合并输出
            {
              Console.Write(i + " ");
            }
            Console.WriteLine();
        }

按Ctrl+F5键查看运行结果,如图7.17所示。

图7.17 ArrayList元素的添加实例运行结果

说明 在ArrayList集合中插入一个数组时,只需要在上面代码中重新声明一个一维数组,并将List.Insert(6,6)语句改为List.InsertRange(6,一维数组名)即可。

注意 程序中使用ArrayList类时,需要在命名空间区域添加using System.Collections;,下面将不再提示。

闯关训练:使用ArrayList集合记录学生的姓名、性别及出生年月等信息。如:

小王 男1980-03-08

小刘 女1981-06-21

小赵 男1990-07-01

小李 男1995-09-25

7.6.3 ArrayList元素的删除

在ArrayList集合中删除元素时,可以使用ArrayList类提供的Clear方法、Remove方法、RemoveAt方法和RemoveRange方法。下面对这4个方法进行详细介绍。

1.Clear方法

Clear方法用来从ArrayList中移除所有元素,其语法格式如下。

        public virtual void Clear()

【例7.28】声明一个包含6个元素的一维数组,并使用该数组实例化一个ArrayList对象,然后使用Clear方法清除ArrayList中的所有元素,代码如下。

        int[] arr = new int[] { 1, 2, 3, 4, 5, 6 };
        ArrayList List = new ArrayList(arr);
        List.CIear();
2.Remove方法

Remove方法用来从ArrayList中移除特定对象的第一个匹配项,其语法格式如下。

        public virtual void Remove(Object obj)

obj:要从ArrayList移除的Object,该值可以为空引用。

说明 在删除ArrayList中的元素时,如果不包含指定对象,则ArrayList将保持不变。

【例7.29】声明一个包含6个元素的一维数组,并使用该数组实例化一个ArrayList对象,然后使用Remove方法从声明的ArrayList对象中移除与3匹配的元素,代码如下。

        int[] arr = new int[] { 1, 2, 3, 4, 5, 6 };
        ArrayList List = new ArrayList(arr);
        List.Remove(3);
3.RemoveAt方法

RemoveAt方法用来移除ArrayList的指定索引处的元素,其语法格式如下。

        public virtual void RemoveAt(int index)

index:要移除的元素的从零开始的索引。

【例7.30】声明一个包含6个元素的一维数组,并使用该数组实例化一个ArrayList对象,然后使用RemoveAt方法从声明的ArrayList对象中移除索引为3的元素,代码如下。

        int[] arr = new int[] { 1, 2, 3, 4, 5, 6 };
        ArrayList List = new ArrayList(arr);
        List.RemoveAt(3);
4.RemoveRange方法

RemoveRange方法用来从ArrayList中移除一定范围的元素,其语法格式如下。

        public virtual void RemoveRange(
            int index,
            int count)

index:要移除的元素的范围从零开始的起始索引。

count:要移除的元素数。

注意 在RemoveRange方法中参数count的长度不能超出数组的总长度减去参数index的值。

【例7.31】声明一个包含6个元素的一维数组,并使用该数组实例化一个ArrayList对象,然后在该ArrayList对象中使用RemoveRange方法从索引3处删除两个元素,代码如下。

        int[] arr = new int[] { 1, 2, 3, 4, 5, 6 };
        ArrayList List = new ArrayList(arr);
        List.RemoveRange(3,2);

【例7.32】创建一个控制台应用程序,使用RemoveRange方法删除ArrayList集合中的一批元素。程序代码如下。(实例位置:光盘\TM\sl\7\13)

        static void Main(string[] args)
        {
            int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            ArrayList List=new ArrayList(arr);           //使用声明的一维数组实例化一个ArrayList对象
            Console.WriteLine("原ArrayList集合:");
            foreach (int i in List)                      //遍历ArrayList集合中的元素并输出
            {
              Console.Write(i.ToString() + " ");
            }
            Console.WriteLine();
            List.RemoveRange(0, 5);                      //从ArrayList集合中移除指定下标位置的元素
            Console.WriteLine("删除元素后的ArrayList集合:");
            foreach (int i in List)                      //遍历删除元素后的ArrayList集合并输出其元素
            {
              Console.Write(i.ToString() + " ");
            }
            Console.WriteLine();
        }

按Ctrl+F5键查看运行结果,如图7.18所示。

图7.18 ArrayList元素的删除实例运行结果

7.6.4 ArrayList的遍历

ArrayList集合的遍历与数组类似,都可以使用foreach语句,下面通过一个实例说明如何遍历ArrayList集合中的元素。

【例7.33】创建一个控制台应用程序,其中实例化了一个ArrayList对象,并使用Add方法向ArrayList集合中添加了两个元素,然后使用foreach语句遍历ArrayList集合中的各个元素并输出。程序代码如下。(实例位置:光盘\TM\sl\7\14)

        static void Main(string[] args)
        {
            ArrayList list=new ArrayList();              //实例化一个ArrayList对象
            list.Add("TM");                              //向ArrayList集合中添加元素
            list.Add("C#从入门到精通");
            foreach(string str inlist)                   //遍历ArrayList集合中的元素并输出
            {
              Console.WriteLine(str);
            }
        }

按Ctrl+F5键查看运行结果,如图7.19所示。

图7.19 ArrayList的遍历实例运行结果

7.6.5 ArrayList元素的查找

查找ArrayList集合中的元素时,可以使用ArrayList类提供的Contains方法、IndexOf方法和LastIndexOf方法。IndexOf方法和LastIndexOf方法的用法与string字符串类的同名方法的用法基本相同,下面主要对Contains方法进行详细介绍。

Contains方法用来确定某元素是否在ArrayList集合中,其语法格式如下。

        public virtual bool Contains(Object item)

item:要在ArrayList中查找的Object,该值可以为空引用。

返回值:如果在ArrayList中找到item,则为true;否则为false。

【例7.34】声明一个包含6个元素的一维数组,并使用该数组实例化一个ArrayList对象,然后使用Contains方法判断数字2是否在ArrayList集合中,代码如下。

        int[] arr = new int[] { 1, 2, 3, 4, 5, 6 };
        ArrayList List = new ArrayList(arr);
        Console.Write(List.Contains(2));               //判断ArrayList集合中是否包含指定的元素

程序的运行结果为true。