Array 与 ArrayList

 这篇文章解释如何使用最简单的方法把Array转换成ArrayList和相反的转换。

使用的.NET类
System.Collections.ArrayList

介绍
操作数组是应用开发中最普通的任务之一。有时你需要使用一组对象来获得操作对象的属性的能力,并且有时你为了更大的灵活性而使用ArrayList。在这两种方式之间进行抉择是非常痛苦的事情。这篇文章教你如何更好的去解决这个问题。

笨方法
几乎所有的初学者都是手工进行的变换。就从转换对象数组到ArrayList来说,一种方法可能是先初始化一个ArrayList对象,然后再循环把数组里的每一个对象添加到ArrayList中。
让我们假设我们有一个称做Person的对象。下面是通常的做法:

1 Person[] personArray = myPerson.GetPersons();
2 ArrayList personList = new ArrayList();
3 foreach (Person objPerson in personArray)
4 {
5    personList.Add(objPerson);
6}


并且也可以使用这种方式从一个ArrayLIst创建一个对象数组:

1 Person[] personArrayFromList = new Person[personList.Count];
2 int arrayCounter = 0 ;
3 foreach (Person objPerson in personList)
4 {
5    personArrayFromList.SetValue(objPerson,arrayCounter++);
6}


简单的方法
但是我们为什么不使用.NET类库内置的方法来实现这个功能呢?
把一个对象数组转换成ArrayList可以使用ArrayList.Adapter方法。这个方法把一个IList包裹在一个ArrayLIst里。现在上面的代码就可以写成:

1 Person[] personArray = myPerson.GetPersons();
2 ArrayList personList = ArrayList.Adapter(personArray);


把一个ArrayList转换成对象数组可以使用ArrayList.ToArray方法。现在上面的代码就可以写成:

1 Person[] personArrayFromList = (Person[])personList.ToArray( typeof (Person));


不要忘了在调用ArrayList.ToArray方法之前进行强制类型转换,否则在编译的时候会出错提示你不能把一个ArrayList转换成Person对象数组。

总结
综上所述,下次你要转换一个对象数组为ArrayList的时候,就可以使用静态方法ArrayList.Adapter;或者可以使用ArrayList对象的ArrayLIst.ToArray方法来实现相反的转换。

PS:

字符串转换为数组:
VB.NET
Dim str As Atring = "Table,Item,ID"
Dim arr() As String
arr= str.Split(Convert.ToChar(","))

首先,ArrayList的ToArray方法是常用的,且没有任何问题;
但是使用ArrayList.Adapter方法时,需要注意的是,该方法是直接把Array包裹在其里面,而没有进行任何复制,也就是说,这时Array和ArrayList指向的是同一个物体。

那么,这会造成什么后果呢?

首先,改变Array或ArrayList任意一方的值,另一方也将随之改变:
int[] MyIntArray = new int[3];
MyIntArray[0] = 1;
MyIntArray[1] = 2;
MyIntArray[2] = 3;

ArrayList arrList = ArrayList.Adapter(MyIntArray);
arrList[0] = 10;

Console.WriteLine(MyIntArray[0]);

结果跟你想象的一样,是10,而不是1。

其次,由于Array是固定长度的,包裹了Array的ArrayList将无法执行Add,Remove等操作,这样在很多情况下就失去了我们使用ArrayList的意义。

因此,如果你真的想把一个数组赋给ArrayList,最好还是利用拷贝的方法。

ArrayList   ls=AList.build();  
  A[]   me=new   A[ls.Count];  
  ls.CopyTo(me);

 

 

 

ArrayList 是数组的复杂版本。ArrayList 类提供在大多数 Collections 类中提供但不在 Array 类中提供的一些功能。

   例如: Array 的容量是固定的,而 ArrayList 的容量是根据需要自动扩展的。如果更改了 ArrayList.Capacity 属性的值,则自动进行内存重新分配和元素复制。
ArrayList 提供添加、插入或移除某一范围元素的方法。在 Array 中,您只能一次获取或设置一个元素的值。
使用 Synchronized 方法可以很容易地创建 ArrayList 的同步版本。而 Array 将一直保持它直到用户实现同步为止。
ArrayList 提供将只读和固定大小包装返回到集合的方法。而 Array 不提供。
另一方面,Array 提供 ArrayList 所不具有的某些灵活性。例如:

可以设置 Array 的下限,但 ArrayList 的下限始终为零。
Array 可以具有多个维度,而 ArrayList 始终只是一维的。
特定类型(不是 Object)的 Array 具有比 ArrayList 更好的性能,这是因为 ArrayList 的元素属于 Object 类型,所以在存储或检索值类型时通常发生装箱和取消装箱。
要求一个数组的大多数情况也可以代之以使用 ArrayList。它更易于使用,并且通常具有与 Object 类型的数组类似的性能。

Array 位于 System 命名空间中;ArrayList 位于 System.Collections 命名空间中。


______________________________________________________________________________________________
答2:
ArrayList能动态地增加或减少其所容量的元素数量,ArrayList默认容量是16,当元素数量超过集合容量时,其容量会自动增加;想使用普通数组,但又不愿为分配与释放内存、搜索、排序等费神时,使用ArrayList是极为合适的。
Array的大小是固定的,利用Array能减少处理时间,处理ArrayList集合中的大量无序元素,此时将ArrayList集合转化为数组更合适,因为在数组中可用索引直接指定元素并对它进行处理。
______________________________________________________________________________________________
答3:
嗯,对我来说:
如果我已经知道上限,而且数据是同一类型的,我会用 Array
否则就用 ArrayList。
______________________________________________________________________________________________
答4:
最有用的区别就是一个是固定长度(array),一个是可变长度(arraylist)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值