将DataTable类型转换为list时,看到返回类型中不仅仅存在list,同时还有ArrayList和Ilist,曾经的曾经只是见过,没有具体的分析过其中的内容。这次想一探究竟。
说道ArrayList集合,必须先了解它的来源:数组——简单理解数组的话就是对数据的一个整合,优点:由于数据在内存中连续存储,因此可以快速而容易的从头到尾遍历元素,可以快速的修改元素等等,但是,有一个缺点便是:创建数组时必须指定数组变量的大小,还有就是在两个元素之间添加元素比较困难,所以引入了ArrayList集合。
ArrayList集合是命名空间System.Collections下的一部分,它是使用大小可按需动态增加的数组实现IList接口。换句话说,ArrayList集合是不需要指定大小的,另外,由于它实现了IList接口,所以,Arraylist提供添加,插入或移除该范围内元素的方法,且在移除后,后边元素补充该位置,最终保证元素的连续性,这也打败了数组的“在两个元素之间添加元素比较困难”的缺点。
综上所述,貌似看起来ArrayList集合很完美,可是为什么又引入list泛型集合呢?
list泛型集合是命名空间System.Collections.Generic下的一部分。同样它也是使用大小可按需动态增加的数组实现了IList接口,重点在于:
dim mylist as list(of T)
那个T就是你需要指定的集合的数据或对象类型。而ArrayList集合则是object类型。也就是说它是不指定数据类型的,什么对象都可以接受,因为在它眼里,这些元素都是object类型。这样貌似很方便,但是这让我联想到另外一个问题:为什么要设置数据类型?既然可以用object类型,那还分什么数据类型?干脆使用object了?显而易见,这样肯定不行的,如果使用arraylist集合,容易引发的便是类型不匹配错误,换句话说,Arraylist不是类型安全的。在使用该集合元素的过程中,就要不断的进行装箱拆箱的工作,这带来的便是巨大的性能损耗。所以,这就是为什么又引入泛型集合的意义了。
对比到机房中,为什么是使用泛型集合而不是ArrayList集合?我是这样想的:转为泛型的过程中我们需要指定泛型具体属于哪个实体类型,这样的话,泛型集合就被缩小到一个具体的实体范围当中。这样可以方便对其中元素操作;可如果换成Arraylist集合,没有被指定具体的集合类型,这样操作其中元素的过程中,避免不了大量的装箱拆箱的过程,所以,选择了前者。
而对于为什么使用泛型集合而不使用IList?这个问题的话,经查阅资料显示:在对集合数据进行处理,从中筛选数据或者排序时,更偏向于用List,具体的话,可以做为一个问题,有兴趣的同伴可以思考一下,我们也可以一起探讨。