一、List
List构造函数一共有3个
List
底层的实现是通过Array
数组来实现的(private T[] _items
)
怎么实现无限地往数组里面添加元素?(示意图)
二、LINQ之ToList
System.Linq
命名空间下实现IEnumerable<T>
的扩展方法。
在开发过程中,LINQ的ToList()
方法经常被使用,帮助我们将迭代器转换为具体的List
对象。为了更好的了解该方法的工作原理,我们从源码的角度对其进行分析。
ToList
本身代码很简单,就是判断参数source
是否实现了IIListProvider
接口,如果实现了该接口,则调用该方法进行转换,如果未实现该接口,则直接调用List
的构造方法,创建一个新的List
,然后返回。
IIListProvider
接口定义了三个方法,其中包括ToList
方法。
Select().Tolist()
示例分析
进入扩展方法Select
,studentList
是List
类型,所以返回SelectListIterator
迭代器对象,该对象包含投影方法和lList
数据。
进入扩展方法ToList
,SelectListIterator
实现了IIListProvider
方法,所以实际上是调用SelectListIterator
自己的ToList
方法,该方法源码如下:
IPartition
是一个用于处理分页的接口,该接口继承了 IIListProvider
,因此SelectListIterator
类需实现方法ToList
;
进入该方法后,获取studentList
内元素个数,因为List
实现了ICollection
接口,所以通过属性值Count
直接获取序列内元素个数;
定义新的List
序列。
在序列每个元素上执行投影操作,将结果存入新建的List
中;
返回List
对象。