C#程序设计自学经典
上QQ阅读APP看书,第一时间看更新

4.4 ArrayList类

ArrayList是命名空间System.Collections的子集,在使用该类时必须引用其命名空间,同时ArrayList继承了IList接口,提供了数据存储和检索。ArrayList对象的大小是按照其中存储的数据来动态扩充与收缩的。所以,在声明ArrayList对象时并不需要指定它的长度。

4.4.1 ArrayList类的声明与初始化

声明ArrayList可以使用如下三种方法。

(1)使用ArrayList类的默认构造方法来声明ArrayList,语法如下:

    ArrayList arrayList=new ArrayList();

使用此种方式声明的ArrayList将以默认16的大小来初始化内部的数组。

(2)从继承自ICollection接口的指定集合复制元素到ArrayList,并且ArrayList具有与所复制的元素数相同的初始容量,语法如下:

    ArrayList arrayList=new ArrayList(arrayName);

其中,arrayName为要添加集合的数组名。

(3)用指定的大小初始化内部数组,其语法如下:

    ArrayList arrayList=new ArrayList(count);

其中,count为为ArrayList对象分配的空间大小。

4.4.2 ArrayList的使用

1.ArrayList的属性及其方法

ArrayList的属性及其方法与之前学习的数组相比要多得多。使用上也比数组要灵活得多。如表4-1所示为ArrayList的属性及其方法。

表4-1 ArrayList的属性及其方法

续表

2.ArrayList元素的添加

向ArrayList添加元素时可以使用ArrayList类的Add方法和Insert方法,下面将分别对这两种方法进行讲解。

1)Add方法

此方法将对象添加到ArrayList的结尾处,是最常用的方法之一,此方法将把添加的元素作为Object的对象添加。其返回值为int类型,为ArrayList的索引值。ArrayList允许把null添加至ArrayList中,并且允许添加重复的元素。例4-3演示了使用Add方法将整型添加至ArrayList,并输出其元素值。

例4-3:ArrayList的Add方法(ConsoleArrayListAddMethod)

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleArrayListAddMethod
    {
        class Program
        {
            static void Main(string[] args)
            {
                ArrayList list = new ArrayList();
                list.Add(1);
                list.Add(9);
                list.Add(3);
                list.Add(7);
                list.Add(0);
                list.Add(88);
                foreach (int i in list)
                {
                    Console.WriteLine(i);
                }
                Console.ReadLine();
            }
        }
    }

运行结果如图4-3所示。

图4-3 ArrayList的Add方法

2)Insert方法

Insert方法将元素插入ArrayList的指定索引处。其方法如下:

    public virtual void Insert(
        int index,
        Object value
    )

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

value为要插入的Object对象,该值可以为null。

例4-4演示了使用Insert方法将元素添加至ArrayList,并输出其元素值。

例4-4:ArrayList的Insert方法(ConsoleArrayListInsertMethod)

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleArrayListInsertMethod
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                string[] strs = new string[] { "Hello,", "World!\n", "Hello,
                ", "China!\n" };
                ArrayList list = new ArrayList(strs);
                Console.WriteLine("原始数据为:");
                foreach (string str in list)
                {
                    Console.Write(str);
                }
                Console.WriteLine();
                list.Insert(4, "Hello,");
                list.Insert(5, "Kitty!\n");
                list.Insert(6, "Hello,");
                list.Insert(7, "KuGou!\n");
                Console.WriteLine("使用Insert方法添加后的数据为:");
                for (int i = 0; i < list.Count; i++)
                {
                    Console.Write(list[i].ToString());
                }
                Console.WriteLine();
                Console.ReadLine();
            }
        }
    }

运行结果如图4-4所示。

图4-4 ArrayList的Insert方法

关键点解析:

    list.Insert(4, "Hello,");

此代码使用Insert方法在ArrayList的对象list的索引位置4处插入“Hello,”字符串,若此时将Insert方法的第一个参数值4改为5或更大值,则程序会报出ArgumentOutOfRangeException异常,根据VS中的异常提示“插入索引已超出范围。必须为非负值,并且必须小于或等于大小”可知,插入的索引值必须小于等于ArrayList的对象list的大小。

    for (int i = 0; i < list.Count; i++)

此句使用了ArrayList对象的Count方法取得ArrayList中包含的元素个数作为循环的限定条件。

    Console.Write(list[i].ToString());

此句中使用ArrayList对象的索引形式访问元素,索引从0开始。

3.ArrayList元素的删除

在ArrayList中可以使用ArrayList类提供的Clear方法、Remove方法、RemoveAt方法以及RemoveRange方法来删除元素。下面就分别介绍下这4种方法。

1)Clear方法

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

    public virtual void Clear()

2)Remove方法

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

    public virtual void Remove(
        Object obj
    )

其中,obj为要从ArrayList中移除的Object对象,该值可以为null。

3)RemoveAt方法

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

    public virtual void RemoveAt(
        int index
    )

其中,index为要移除的元素的从零开始的索引。

4)RemoveRange方法

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

    public virtual void RemoveRange(
        int index,
        int count
    )

其中,index为要移除的元素的范围从零开始的起始索引,count为要移除的元素数。

例4-5演示了使用以上4种方法来移除ArrayList对象中的元素。

例4-5:ArrayList元素的删除(ConsoleArrayListDelete)

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleArrayListDelete
    {
        class Program
        {
            static void Main(string[] args)
            {
                int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
                ArrayList list = new ArrayList(arr);
                Console.WriteLine("list中的元素为:");
                foreach (int i in list)
                {
                    Console.Write(i + " ");
                }
                list.Remove(2);
                Console.WriteLine("\n使用Remove方法移除数字2后,list中剩余元素为:");
                foreach (int i in list)
                {
                    Console.Write(i + " ");
                }
                list.RemoveAt(5);
                Console.WriteLine("\n使用RemoveAt方法移除索引值为5的元素后,list
                中剩余元素为:");
                foreach (int i in list)
                {
                    Console.Write(i + " ");
                }
                list.RemoveRange(3, 2);
                Console.WriteLine("\n使用RemoveRange方法从索引值为3的元素开始移除
                2个元素后,list中剩余元素为:");
                foreach (int i in list)
                {
                    Console.Write(i + " ");
                }
                list.Clear();
                Console.WriteLine("\n已经使用了Clear方法移除了list中的所有元素!");
                Console.ReadLine();
            }
        }
    } 

运行结果如图4-5所示。

图4-5 ArrayList元素的删除

4.ArrayList元素的查找

查找ArrayList的元素时,可使用第2章中讲解过的字符串类的同名方法——IndexOf方法和LastIndexOf方法。除此之外还可使用ArrayList类提供的Contains方法。下面就主要介绍Contains方法。

Contains方法用于确定某元素是否在ArrayList中,其语法格式如下:

    public virtual bool Contains(
        Object item
    )

其中,item为要在ArrayList中查找的Object对象,该值可以为null。

其返回值如果在ArrayList中找到item,则为true;否则为false。下面的例子演示了使用Contains方法判断ArrayList中是否存在某元素。

例4-6:使用Contains方法判断ArrayList中是否存在某元素(ConsoleArrayList- ContainsMethod)

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleArrayListContainsMethod
    {
        class Program
        {
            static void Main(string[] args)
            {
                ArrayList list = new ArrayList();
                for (int i = 0; i <= 100; i++)
                {
                    list.Add(i);
                }
                Console.WriteLine("list中包含以下元素:");
    
                foreach (int i in list)
                {
                    Console.Write(i + " ");
                }
                string str;
    
                while (true)
                {
                    Console.Write("\n\n请输入一个正整数(输入"x"退出循环):");
                    str = Console.ReadLine();
                    if (str == "x")
                        break;
                    if (list.Contains(int.Parse(str)))
                    Console.WriteLine("list中包含元素值为{0}的元素!", str);
                    else
                        Console.WriteLine("list中不包含元素值为{0}的元素!", str);
                }
                Console.ReadLine();
            }
        }
    }

运行结果如图4-6所示。

图4-6 使用Contains方法判断ArrayList中是否存在某元素

关键点解析:

    if (list.Contains(int.Parse(str)))

此句中使用ArrayList对象的Contains方法判断输入的值是否在ArrayList中存在,此处要注意的是:因为ArrayList对象list中存储的是整型数据,而输入的值为字符串类型,需把其转为整型进行判断,否则即使字面值相同,但数据类型不同,判断结果也为false,这就失去了判断的意义。