C# ArrayList 类(动态数组)是一个最常用的集合类,与数组的操作方法也是最类似的。

动态数组(ArrayList)代表了可被单独索引的对象的有序集合。它基本上可以替代一个数组。但是,与数组不同的是,您可以使用索引在指定的位置添加和移除项目,动态数组会自动重新调整它的大小。它也允许在列表中进行动态内存分配、增加、搜索、排序各项。

创建 ArrayList 类的对象需要使用该类的构造方法,如下表所示。

构造方法

作用

ArrayList()

初始化 ArrayList 类的新实例,该实例为空并且具有默认初始容量。

ArrayList(ICollection)

初始化 ArrayList 类的新实例,该类包含从指定集合复制的元素,并具有与复制的元素数相同的初始容量。

ArrayList(Int32)

初始化 ArrayList 类的新实例,该实例为空并且具有指定的初始容量。

一、常用方法

1、ArrayList.Add(Object) 方法

将对象添加到 ArrayList 的结尾处。

ArrayList 接受 null 作为有效值,并允许重复元素。

实例代码:

ArrayList test = new ArrayList();
test.Add("张三");
test.Add(null);
test.Add("王五");
test.Add("王五");
foreach (var v in test)
{
	Console.WriteLine(v);
}

2、ArrayList.AddRange(ICollection) 方法

将 ICollection 的元素添加到 ArrayList 的末尾。

实例代码:

ArrayList test = new ArrayList()
{
	"张三","李四","王五"
};
ArrayList addList = new ArrayList()
{
	34,43,657
};
test.AddRange(addList);//将addList元素添至test尾端
foreach (var v in test)
{
	Console.WriteLine(v);
}

3、ArrayList.Clear 方法

从 ArrayList 中移除所有元素。

实例代码:

ArrayList test = new ArrayList()
{
	"张三","李四","王五"
};
test.Clear();//清空 test
foreach (var v in test)
{
	Console.WriteLine(v);
}

4、ArrayList.Contains(Object) 方法

确定某元素是否在 ArrayList 中。

public virtual bool Contains (object item);

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

实例代码:

ArrayList test = new ArrayList()
{
	234,456,325,3456,654
};
Console.WriteLine(test.Contains(345) ? "集合中含有" : "集合中不含有");

5、ArrayList.CopyTo 方法

将 ArrayList 或它的一部分复制到一维数组(已有数组)。

(1)、CopyTo(Array)

从目标数组的开头开始,将整个 ArrayList 复制到兼容的一维 Array。(替换原有位置元素)

public virtual void CopyTo (Array array);

从目标数组 array 的第 0 个位置开始,将整个集合中的元素复制到类型兼容的数组 array 中。

注意:目标数组的容量要大于等于ArrayList中的元素个数。

实例代码:

ArrayList test = new ArrayList()
{
	234,245,654,242
};
int[] array = new int[6]{2,4,6,4,2,6};//类型要兼容
foreach (var v in array)
{
	Console.WriteLine(v);
}
test.CopyTo(array);//用test中的元素来替换array中的元素
Console.WriteLine("操作后的结果:")
foreach (var v in array)
{
	Console.WriteLine(v);
}

(2)、CopyTo(Array, Int32)

从目标数组的指定索引处开始将整个 ArrayList 复制到兼容的一维 Array。

public virtual void CopyTo (Array array, int arrayIndex);

从目标数组 array 的指定索引 arraylndex 处,将整个集合中的元素赋值到类型兼容的数组 array 中。

注意:从 arrayIndex 到目标 array 末尾之间的可用空间要大于等于源 ArrayList 中的元素个数。

实例代码:

ArrayList test = new ArrayList()
{
	"张三","李四","王五","马六","陈七"
};
string[] array = new string[7]{"1","2","3","4","5","6","7"};
test.CopyTo(array,1);//从array第二个元素开始替换
foreach (var v in array)
{
	Console.WriteLine(v);
}

(3)、CopyTo(Int32, Array, Int32, Int32)

从目标数组的指定索引处开始,将 ArrayList 中某个范围的元素复制到兼容的一维数组 Array。

public virtual void CopyTo (int index, Array array, int arrayIndex, int count);

从目标数组 array 的指定索引 arrayindex 处,将集合中从指定索引 index 开始的 count 个元素复制到类型兼容的数组 array 中。

注意:

  • index 小于或等于源 ArrayList 的 Count 数。
  • 从 index 到源 ArrayList 的末尾的元素数要小于等于从 arrayIndex 到目标 array 的末尾的可用空间。
  • 这里的 count 是要复制的元素数。

实例代码:

ArrayList test = new ArrayList()
{
	"张三","李四","王五","马六","陈七"
};
string[] array = new string[7] { "1", "2", "3", "4", "5", "6", "7" };
test.CopyTo(2, array, 2, 3);//截取test中自索引2开始的3个数,替换到array中自索引2开始的3个数
foreach (var v in array)
{
	Console.WriteLine(v);
}

6、ArrayList.IndexOf 方法

返回 ArrayList 或它的一部分中某个值的第一个匹配项的从零开始的索引。

(1)、IndexOf(Object)

搜索指定的 Object,并返回整个 ArrayList 中第一个匹配项的从零开始的索引。

public virtual int IndexOf (object value);

获取 value 值在集合中第一次出现的位置。如果找到,则为整个 value 中 ArrayList 第一个匹配项的从零开始的索引;否则为 -1。

实例代码:

ArrayList test= new ArrayList()
{
	"aaa","bbb","abc",123,456
};
int index = test.IndexOf("abc");//自 索引0 开始查找 abc
Console.WriteLine(index != -1 ? "集合中存在元素 abc" : "集合中不存在元素 abc");

(2)、IndexOf(Object, Int32)

搜索指定的 Object,并返回 ArrayList 中从指定索引到最后一个元素的元素范围中第一个匹配项的从零开始索引。

public virtual int IndexOf (object value, int startIndex);

获取 value 值在集合的 startindex 位置开始往后第一次出现的位置

实例代码:

ArrayList test = new ArrayList()
{
	"胡三",2312,233,"斯蒂夫",355
};
int index = test.IndexOf(233,3);//自 索引3 开始查找 233
Console.WriteLine(index != -1 ? "本次查询到了元素 233" : "本次没有查询到元素 233");

(3)、IndexOf(Object, Int32, Int32)

搜索指定的 Object,并返回 ArrayList 中从指定索引开始,并包含指定元素数的元素范围中第一个匹配项的从零开始的索引。

public virtual int IndexOf (object value, int startIndex, int count);

获取 value 值在集合的 startindex 位置开始向后推移 count 个元素中第一次出现的位置

实例代码:

ArrayList test = new ArrayList()
{
	"张三",123,"李四",345,"王五",567,"马六",789	
};
int index = test.IndexOf(567,1,5);//在test中查找自 索引1 开始的 5 个元素中是否有元素 567
Console.WriteLine(index != -1 ? "本次查询到了元素567" : "本次没有查询到元素567");

7、ArrayList.Insert(Int32, Object) 方法

将元素插入 ArrayList 的指定索引处。

public virtual void Insert (int index, object value);

返回 value 向集合中的指定索引 index 处插

实例代码:

ArrayList test = new ArrayList()
{
	"aaa","bbb","abc",123,345
};
test.Insert(1,"李四");//向test 索引1 处插入元素
foreach (var v in test)
{
	Console.WriteLine(v);
}

8、ArrayList.InsertRange(Int32, ICollection) 方法

将集合中的元素插入 ArrayList 的指定索引处。

public virtual void InsertRange (int index, ICollection c);

向集合中的指定索引 index 处插入一个集合

实例代码:

ArrayList test = new ArrayList()
{
	"aaa","bbb","abc",123,456
};
ArrayList list = new ArrayList()
{
	"A","B","C"
};
test.InserRange(2,list);//将 集合list 插入到 集合test 的 索引2 处
foreach (var v in test)
{
	Console.WriteLine(v);
}

9、ArrayList.LastIndexOf 方法

返回 ArrayList 或它的一部分中某个值的最后一个匹配项的从零开始的索引。

(1)、LastIndexOf(Object)

在整个 Object 中搜索指定的 ArrayList,并返回最后一个匹配项的从零开始的索引。

public virtual int LastIndexOf (object value);

返回 value值在集合中最后一次出现的位置

注意:从最后一个元素开始向前搜索ArrayList,并在第一个元素处结束

实例代码:

ArrayList test = new ArrayList()
{
	"张三","李四",435,234,12324,545,5464
};
int index = test.LastIndexOf(234);
Console.WriteLine(index != -1 ? "本次查询含有元素234" : "本次查询不含元素234");

(2)、LastIndexOf(Object, Int32)

搜索指定的 Object,并返回 ArrayList 中从第一个元素到指定索引这部分元素中最后一个匹配项的位置。

public virtual int LastIndexOf (object value, int startIndex);

获取在集合指定的 startindex 位置开始直到第一个元素区间,值value最后一次出现的位置。

实例代码:

ArrayList test = new ArrayList()
{
	"张三","李四",435,534,123,234,545,5464
};
int index = test.LastIndexOf(234 , 4);//自 索引4 向前查询,元素 234 最后一次出现的位置
Console.WriteLine(index != -1 ? "本次查询含有元素234" : "本次查询不含有元素234");

(3)、LastIndexOf(Object, Int32, Int32)

搜索指定的 Object,并返回 ArrayList 中到指定索引为止包含指定元素数的这部分元素中最后一个匹配项的从零开始的索引。

public virtual int LastIndexOf (object value, int startIndex, int count);

返回 value值在集合的 startindex 位置向前开始 count 个元素中最后一次出现的位置

实例代码:

ArrayList test = new ArrayList()
{
	"张三","李四",435,534,123,234,545,5464
};
int index = test.LastIndexOf(234,6,3);
Console.WriteLine(index1 != -1 ? "本次查询含有元素234" : "本次查询不含有元素234");

10、ArrayList.Remove(Object) 方法

从 ArrayList 中移除特定对象的第一个匹配项。

public virtual void Remove (object obj);

将集合中第一个匹配到的指定元素 obj 从集合中移除

实例代码:

ArrayList test = new ArrayList()
{
	"张三","李四","张三","王五","马六","陈七"
};
test.Remove("张三");
foreach (var v in test)
{
	Console.WriteLine(v);
}

11、ArrayList.RemoveAt(Int32) 方法

移除 ArrayList 的指定索引处的元素。

public virtual void RemoveAt (int index);

移除集合中指定位置 index 处的元素

实例代码:

ArrayList test = new ArrayList()
{
	"张三","李四","李四","王五","马六","陈七"
};
test.RemoveAt(2);//移除 索引2 位置的元素
foreach (var v in test)
{
	Console.WriteLine(v);
}

12、ArrayList.RemoveRange(Int32, Int32) 方法

从 ArrayList 中移除一系列元素。

public virtual void RemoveRange (int index, int count);

移除集合中自索引 index 处向后的 count 个元素

实例代码:

ArrayList test = new ArrayList()
{
	"张三","李四","王五","马六","陈七","周八"
};
test.RemoveRange(2,3);//自 索引2 向后的 3 个元素
foreach (var v in test)
{
	Console.WriteLine(v);
}

13、ArrayList.Reverse 方法

将 ArrayList 或它的一部分中元素的顺序反转。

(1)、Reverse()

将整个 ArrayList 中元素的顺序反转。

public virtual void Reverse ();

实例代码:

ArrayList test = new ArrayList()
{
	"张三","李四","王五","马六","陈七"
};
test.Reverse();
foreach (var v in test)
{
	Console.WriteLine(v);
}

(2)、Reverse(Int32, Int32)

将指定范围中元素的顺序反转。

public virtual void Reverse (int index, int count);

将集合中从指定位置 index 处向后的 count 个元素反转

实例代码:

ArrayList test = new ArrayList()
{
	"张三","李四","王五","马六","陈七"
};
test.Reverse(2,3);//自 索引2 向后的 3 个元素
foreach (var v in test)
{
	Console.WriteLine(v);
}

14、ArrayList.Sort 方法

对 ArrayList 或它的一部分中的元素进行排序。

(1)、Sort()

对整个 ArrayList 中的元素进行排序。

public virtual void Sort ();

将集合中的元素排序,默认从小到大排序

实例代码:

ArrayList test = new ArrayList()
{
	234,345,4325,2345,4625,23,22435
};
test.Sort();
foreach (var v in test)
{
	Console.WriteLine(v);
}

(2)、Sort(IComparer)

使用指定的比较器对整个 ArrayList 中的元素进行排序。

public virtual void Sort (System.Collections.IComparer comparer);

将集合中的元素按照比较器 comparer 的方式排序

实例代码:

class MyCompare : IComparer
{
	//方法一
	public int Compare(object x, object y)
    {
		return ((new CaseInsensitiveComparer()).Compare(y, x));//返回从大到小
    }

	//方法二
	public int Compare(object x,object y)
	{
		int num1 = int.Parse(x.ToString());//先把 object 转成string,再转成 int
        int num2 = int.Parse(y.ToString());
		
		return num1.CompareTo(num2);//返回从小到大

		/* 若返回从大到小,改为 return num2.CompareTo(num1) 即可 */
	}
}

static void Main(string[] args)
{
	ArrayList test = new ArrayList()
	{	
		234,1234,435,6546,54,4535,3434,64553,54436,42
	};
	
	IComparer myComparer = new MyCompare();

	test.Sort(myComparer);
	
	foreach (var v in test)
	{	
		Console.WriteLine(v);
	}
}

(3)、Sort(Int32, Int32, IComparer)

使用指定的比较器对 ArrayList 中某个范围内的元素进行排序。

public virtual void Sort (int index, int count, System.Collections.IComparer comparer);

将集合中的元素从指定位置 index 处的 count 个元素按照比较器 comparer 的方式排序

实例代码:

class MyCompare:IComparer
{
	public int Compare(object x,object y)
	{
		return ((new CaseInsensitiveComparer()).Compare(y,x));
	}
}
static void Main(string[] args)
{
	ArrayList test = new ArrayList()
	{
		4132,312,413,134,435,6542,2353,23151,53345,151
	};
	
	IComparer myCompare = new MyCompare();

	test.Sort(2,6,myCompare);//index=2,count=6

	foreach (var v in test)
	{
		Console.WriteLine(v);
	}
}

15、ArrayList.ToArray 方法

将 ArrayList 的元素复制到新数组中。

(1)、ToArray()

将 ArrayList 的元素复制到新 Object 数组中。

public virtual object[] ToArray ();

将 ArrayList 集合转换为 object 数组

实例代码:

ArrayList test=new ArrayList()
{
	1,10,2,3,4,10,5
};
var objArr=test.ToArray();
foreach (var v in objArr)
{
	Console.WriteLine(v);
}

(2)、ToArray(Type)

将 ArrayList 的元素复制到新的指定元素类型数组中。

public virtual Array ToArray (Type type);

将 ArrayList 集合转换为指定类型的数组。

实例代码:

ArrayList test=new ArrayList()
{
	1,10,2,3,4,10,5
};
Array intArr = test.ToArray(typeof(int));
foreach (var v in intArr)
{
	Console.WriteLine(v);
}

16、ArrayList.TrimToSize 方法

将容量设置为 ArrayList 中元素的实际数目。

public virtual void TrimToSize ();

将集合的大小设置为集合中元素的实际个数

实例代码:

ArrayList test = new ArrayList()
{
	123,34,342,134,345,456,232
};
Console.WriteLine("集合的 count 是:{0},capacity 是:{1}", test.Count, test.Capacity);
//Trim 后
test.TrimToSize();
Console.WriteLine("集合的 count 是:{0},capacity 是:{1}", test.Count, test.Capacity);
二、常用属性

1、ArrayList.Capacity 属性

获取或设置 ArrayList 可以包含的元素个数。

实例代码:

ArrayList test = new ArrayList()
{
	1,2,3,4,5
};
int nums = test.Capacity;
Console.WriteLine("集合 test 能够包含的元素数:{0}", nums);

2、ArrayList.Count 属性

获取 ArrayList 中实际包含的元素个数。

实例代码:

ArrayList test = new ArrayList()
{
	1,2,3,4,5
};
int nums = test.Count;
Console.WriteLine("集合 test 实际包含的元素数:{0}", nums);

注意:Capacity 始终大于或等于 Count。

3、ArrayList.Item[Int32] 属性

获取或设置指定索引处的元素。

实例代码:

ArrayList test = new ArrayList()
{
	1,2,3,4,5
};
var temp= test[3];//指定第四个数
Console.WriteLine("集合 test 中第四个元素是:{0}",temp);

注意:Item[Int32] 返回 Object,因此,您可能需要将返回的值强制转换为原始类型以便对其进行操作。