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,这就失去了判断的意义。