C# Collection 之数组列表
ArrayList是动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处:动态的增加和减少元素,实现了ICollection和IList接口,灵活的设置数组的大小。ArrayList的元素不是自动排序的。类似一维数组,ArrayList是用索引运算符和索引来访问的。ArrayList静态成员是线程安全的,而示例成员则不是。公共的接口集合(Icollection、Ienumerable 和 Icloneable)看参考MSDN关于接口的说明。
简单示例:
- ArrayList List = new ArrayList();
- //给数组增加10个Int元素
- for (int i = 0; i < 10; i++)
- {
- List.Add(i);
- }
- //程序做一些处理
- //…
- List.RemoveAt(5);//将第6个元素移除
- //再增加3个元素
- for (int i = 0; i < 3; i++)
- {
- List.Add(i + 20);
- }
- //返回ArrayList包含的数组
- Int32[] values = (Int32[])List.ToArray(typeof(Int32));
方法和属性:
1) 构造器
ArrayList提供了三个构造器:
public ArrayList();
默认的构造器,将会以默认(16)的大小来初始化内部的数组
public ArrayList(ICollection);
用一个ICollection对象来构造,并将该集合的元素添加到ArrayList
public ArrayList(int);
用指定的大小来初始化内部的数组
2) IsSynchronized属性和ArrayList.Synchronized方法
IsSynchronized属性指示当前的ArrayList实例是否支持线程同步,而ArrayList.Synchronized静态方法则会返回一个ArrayList的线程同步的封装。如果使用非线程同步的实例,那么在多线程访问的时候,需要自己手动调用lock来保持线程同步
例如:
- ArrayList list = new ArrayList();
- //当ArrayList为非线程包装的时候
- // SyncRoot属性其实就是它自己
- // 但是为了满足ICollection的SyncRoot定义
- // 这里还是使用SyncRoot来保持源代码的规范性
- lock (list.SyncRoot)
- {
- list.Add("Add a Item”");
- }
3) Count属性和Capacity属性
Count属性是目前ArrayList包含的元素的数量,这个属性是只读的。Capacity属性是目前ArrayList能够包含的最大数量,可以手动的设置这个属性,但是当设置为小于Count值的时候会引发一个异常。
4) Add、AddRange、Remove、RemoveAt、RemoveRange、Insert、InsertRange 、Clear、Contains
- Add方法用于添加一个元素到当前列表的末尾
- AddRange方法用于添加一批元素到当前列表的末尾
- Remove方法用于删除一个元素,通过元素本身的引用来删除
- RemoveAt方法用于删除一个元素,通过索引值来删除
- RemoveRange用于删除一批元素,通过指定开始的索引和删除的数量来删除
- Insert用于添加一个元素到指定位置,列表后面的元素依次往后移动
- InsertRange用于从指定位置开始添加一批元素,列表后面的元素依次往后移动
- Clear方法用于清除现有所有的元素
- Contains方法用来查找某个对象在不在列表之中
5) TrimSize方法
这个方法用于将ArrayList固定到实际元素的大小,当动态数组元素确定不在添加的时候,可以调用这个方法来释放空余的内存。
6) ToArray方法
这个方法把ArrayList的元素Copy到一个新的数组中。
ArrayList和数组的转换:
方法一:
- ArrayList List = new ArrayList();
- List.Add(1);
- List.Add(2);
- List.Add(3);
- Int32[] values = (Int32[])List.ToArray(typeof(Int32));
方法二:
- ArrayList List = new ArrayList();
- List.Add(1);
- List.Add(2);
- List.Add(3);
- Int32[] values = new Int32[List.Count];
- List.CopyTo(values);
转换到Object数组:
和数组不一样,因为可以转换为Object数组,所以往ArrayList里面添加不同类型的元素是不会出错的,但是当调用ArrayList方法的时候,要么传递所有元素都可以正确转型的类型或者Object类型,否则将会抛出无法转型的异常。
- ArrayList List = new ArrayList();
- //往数组中添加不同类型的元素
- List.Add("string");
- List.Add(1);
- //正确
- object[] values = List.ToArray(typeof(object));
- //错误
- string[] values = (string[])List.ToArray(typeof(string));
遍历ArrayList的方法:
- ArrayList alist = new ArrayList();
- alist.Add("Hello,");
- alist.Add("Welcome");
- alist.Add("to");
- alist.Add("my");
- alist.Add("blog");
- alist.Add(100);
- alist.Add(200);
- alist.Add(300);
- alist.Add(1.2);
- alist.Add(22.8);
- //………
- //第一种遍历ArrayList对象的方法
- foreach (object o in alist)
- {
- Console.Write(o.ToString() + " ");
- }
- //第二种遍历ArrayList对象的方法
- IEnumerator ie = alist.GetEnumerator();
- while (ie.MoveNext())
- {
- Console.Write(ie.Curret.ToString() + " ");
- }










