使用时ToList(),是否需要考虑对性能的影响?
ToList()
我正在编写一个查询来从目录(即查询)中检索文件:
string[] imageArray = Directory.GetFiles(directory);
但是,由于我想与之合作List<>,所以我决定投入…
List<>
List<string> imageList = Directory.GetFiles(directory).ToList();
因此,在决定进行这种转换时是否应该考虑某种性能影响?或者仅在处理大量文件时才考虑?这是微不足道的转换吗?
IEnumerable.ToList()
是的,IEnumerable<T>.ToList()确实会对性能产生影响,尽管可能只需要关注性能关键的操作,但它是 O(n) 操作。
IEnumerable<T>.ToList()
该ToList()操作将使用List(IEnumerable<T> collection)构造函数。这个构造函数必须复制数组(通常是IEnumerable<T>),否则将来对原始数组的修改T[]也将在源上更改,这通常是不希望的。
List(IEnumerable<T> collection)
IEnumerable<T>
T[]
我想重申的是,这只会对庞大的列表有所作为,复制内存块是一项非常快速的操作。
As
To
您会在LINQ中注意到有几种以As(如AsEnumerable())和To(如ToList())开头的方法。开头的方法To需要进行上述转换(即可能会影响性能),而开头的方法As则不需要,只需要进行一些强制转换或简单操作即可。
AsEnumerable()
List<T>
List<T>如果您有兴趣,这里有一些更详细的说明:)
A List<T>还使用一种称为动态数组的结构,该结构需要按需调整大小,此调整大小事件将旧数组的内容复制到新数组。因此,它从很小的地方开始,并在需要时增加尺寸。
这是的Capacity和Count属性之间的区别List<T>。Capacity指的是幕后数组的大小,Count是其中的项目数List<T>始终为<= Capacity。因此,当将一项添加到列表中时,将其增加到之后Capacity,的大小将List<T>增加一倍,并复制该数组。
Capacity
Count
<= Capacity