使用 ToList()
时,是否需要考虑对性能的影响?
我正在编写查询以从目录中检索文件,这是查询:
string[] imageArray = Directory.GetFiles(directory);
但是,因为我喜欢与 List<>
一起工作相反,我决定加入……
List<string> imageList = Directory.GetFiles(directory).ToList();
那么,在决定进行这样的转换时是否应该考虑某种性能影响 - 或者仅在处理大量文件时才考虑?这是一个可以忽略不计的转换吗?
最佳答案
IEnumerable<T>.ToList()
是的, IEnumerable<T>.ToList()
确实会对性能产生影响,这是一个O(n) 操作,尽管它可能只需要在性能关键操作中引起注意。
ToList()
操作将使用 List(IEnumerable<T> collection)
构造函数。此构造函数必须复制数组(更一般地说是 IEnumerable<T>
),否则将来对原始数组的修改将在源 T[]
上发生变化。这通常也是不可取的。
我想重申这只会对一个巨大的列表产生影响,复制内存块是一个非常快速的操作。
小贴士,As
对比To
您会注意到在 LINQ 中有几种以 As
开头的方法(例如 AsEnumerable()
)和 To
(例如 ToList()
)。以To
开头的方法需要像上面那样的转换(即可能会影响性能),以及以 As
开头的方法不需要并且只需要一些转换或简单的操作。
有关 List<T>
的其他详细信息
这里有更多关于如何 List<T>
的细节。如果您有兴趣,可以使用:)
A List<T>
还使用一个称为动态数组的构造,需要按需调整大小,此调整大小事件将旧数组的内容复制到新数组。所以它从小开始,increases in size if required .
这是 Capacity
之间的区别和 Count
List<T>
上的属性. Capacity
指的是幕后数组的大小,Count
是 List<T>
中的项目数这总是 <= Capacity
.所以当一个项目被添加到列表中时,增加它超过 Capacity
, List<T>
的大小加倍并复制数组。
关于c# - 调用 ToList() 时是否会影响性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15516462/