mBr*_*024 5 c# performance list convertall
我最近了解了List的.ConvertAll扩展.我今天在代码中使用它几次,将我的对象的大型列表转换为其他对象的列表.它似乎工作得很好.但是,我不确定这与仅迭代列表和转换对象相比有多快或多快..ConvertAll是否会使用任何特殊的东西来加速转换过程,或者它只是一种简单的转换列表而无需设置循环的方法?
没有更好的方法来找出比直接去源,字面意思:)
http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs#dbcc8a668882c0db
正如你所看到的,没有特别的魔法在继续.它只是迭代列表并通过您指定的转换器函数创建一个新项.
说实话,我不知道这种方法.更地道.NET的方式做这种投影是通过使用的Select
扩展方法上IEnumerable<T>
,像这样:source.Select(input => new Something(input.Name))
.这样做的好处有三个:
ConvertAll
是前C#3.0天的残余.它无论如何都不是一个非常神秘的方法,并且ConvertAll
是一个非常清晰的描述,但坚持其他人所知道的可能仍然更好Select
.IEnumerable<T>
,但ConvertAll
仅适用于实例List<T>
.如果它是一个数组,一个列表或一个字典,Select
它们与所有这些一起工作并不重要.Select
很懒.在迭代之前它不会做任何事情.这意味着它会返回一个IEnumerable<TOutput>
,ToList()
如果您实际上不需要列表,则可以通过调用或不调用转换为列表.或者,如果您只想转换并检索一百万个项目列表中的前两项,您可以这样做source.Select(input => new Something(input.Name)).Take(2)
.但是如果你的问题纯粹是关于将整个列表转换到另一个列表的性能,那么ConvertAll
它可能会更快一些,因为它不像a Select
后面跟a ToList
(它知道列表有一个大小并且可以通过索引直接访问元素)例如,从底层数组).