Visual C#2005——如何使用ToArray方法返回一个强类型数组

 

我们说明如何使用ArrayList对象的ToArray方法返回一个强类型数组之前,必须要简介一下ArrayArrayList之间的差异。

 

基本上,ArrayList是数组的复杂版本。ArrayList类拥有Collections类所提供的大部分功能,而这些功能则是Array类所付之阙如的。例如:

 

Ø        Array的容量是固定的,ArrayList的容量则会视需要自动扩充。如果 ArrayList.Capacity属性的值更改,记忆体重新分配与元素的复制会自动完成。

Ø        ArrayList提供用来添加、插入或移除特定范围之元素的方法。然而在Array 中,您一次只能够取得或设定一个元素的值。

Ø        您可以很容易使用ArrayListSynchronized方法来轻松创建ArrayList的同步化版本。相对来说,Array则是将它交给用户来实现同步处理。

Ø        ArrayList提供能够将只读与固定大小的包装函数返回给集合的方法。相对来说,Array则不提供。

Ø        当然,ArrayList并非万能,同样的,Array也并非一无是处。事实上,Array提供某些ArrayList没有的弹性。例如:

Ø        您可以设定Array的下限,但是ArrayList的下限则永远是零。

Ø        Array可以拥有多个维度,ArrayList则只能拥有一个维度。

Ø        特定类型(Object除外)的Array拥有优于ArrayList的性能,原因是ArrayList的元素类型为Object,因此如果存储或撷取值类型(Value Type)的话,BoxingUnboxing通常会因此而发生。

 

在大部分的情况中,对数组的调用可以使用ArrayList来代替,如此一来将会比较容易使用,而且通常能够产生类似Object类型数组的性能。

 

另外别忘了,Array位于System命名空间,ArrayList则位于System.Collections命名空间。

 

了解了ArrayArrayList的基本差异之后,我们要谈谈正题,那就是如何使用ArrayList对象的ToArray方法返回一个强类型数组。

 

如果您使用ArrayList类的ToArray方法时并未指定任何参数,则无参数的ToArray方法将会返回一个类型为Object的数组,而且您不可以将此一Object数组转换成您所需的类型的数组。例如,假设您将一个Customer对象加入至一个ArrayList中,则其源列表将不会被制作成一个Customer数组。此举将使得以下的语句会执行失败并返回一个System.InvalidCastException异常:

 

Customer[] custArray = (Customer[]) myArrayList.ToArray();

 

要想返回一个强类型数组,请使用ToArray方法的另外一个重载版本,也就是会接收一个对象类型作为其参数的重载版本。比方说,如果将之前的转换语句改写如下,将能够成功执行:

 

Customer[] custArray =

(Customer[]) myArrayList.ToArray(typeof(Customer));

 

但是请注意,上述的转换必须在ArrayList的所有元素都是相同类型的时候才会成功。如果您尝试使用ToArray方法将一个含有不同类型对象的ArrayList转换成特定的类型,将会失败。

 

以下的程序代码将我们以上的说明作更完整的示范:

 

public class Customer

{

 public string cName;

}

 

private void btnToArray_Click(object sender, EventArgs e)

{

 Customer c = new Customer();

 c.cName = "章立民";

 

 ArrayList al = new ArrayList();

 al.Add(c);

 

 Object cArray = al.ToArray();

 

 // ArrayList 型。

 MessageBox.Show(cArray.GetType().ToString());

 

 // 如果这样写将会发异 InvalidCastException

 // Customer[] custArray = (Customer[])(al.ToArray());

 

 // 使用 ToArray(Type) 版本才可以。

 Customer[] custArray = (Customer[])(

   al.ToArray(typeof(Customer)));

 

 MessageBox.Show(custArray.GetType().ToString());

}

 

章立民研究室敬上

 

 

期待更多精彩,敬请关注:

http://www.china-pub.com/static/jsj_zlm_060824.html

 

posted on 2006-09-26 14:13 章立民研究室 阅读(2558) 评论(10)  编辑 收藏 网摘 所属分类: Visual C# 2005

评论

#1楼 2006-09-26 16:23 lirenzhao[匿名][未注册用户]

IList<Class1> aaa = new List<>(Class1);
Class1[] aaas = aaa.ToArray();

不就行了?
  回复  引用    

#2楼 2006-09-26 18:00 cdsn[未注册用户]

楼上正解,这也上首页。。。 麻烦转新手区吧   回复  引用    

#3楼 2006-09-26 22:10 夏老爷[未注册用户]

哇,泛型,好高深的东东   回复  引用    

#4楼 2006-09-26 23:49 wqxh[未注册用户]

章老师写的书还是不错的,不过我是第一次看到章老师使用C#哦   回复  引用    

#5楼 2006-09-27 09:44 叶漂      

哈哈!章老师写的书对于刚入门的学生来说,还是很不错的了,但放在首页的文章,面对了太多的牛人,想要好评如潮,难于上青天啊!   回复  引用  查看    

#6楼 2006-09-27 13:06 feilng[未注册用户]

这篇文章不如msdn里说的简明   回复  引用    

#7楼 2006-09-27 16:34 影子[匿名][未注册用户]

IList<Class1> aaa = new List<Class1>();
Class1[] aaas = aaa.ToArray();
这样吧.
  回复  引用    

#8楼 2006-10-05 19:05 Cure      

楼主快拿些真家伙出来啊   回复  引用  查看    

#9楼 2006-10-27 00:30 worren[未注册用户]

感觉还行。。。   回复  引用    

#10楼 2007-03-26 08:55 jetz      

感谢章老师,正好碰到这个问题。   回复  引用  查看    

导航

公告


章立民
六度当选MVP
七十本著作酿成
十九载作者生涯
现在有了章立民研究室
依旧陶醉在写作的生活里。

统计

与我联系

搜索

 

常用链接

留言簿

随笔分类(111)

随笔档案(112)

光盘勘误下载

最新随笔

积分与排名

最新评论

阅读排行榜

评论排行榜