我最近了解了 List 的 .ConvertAll 扩展。我今天在工作中在代码中使用了几次它,将我的大量对象列表转换为其他对象的列表。看起来效果真的很好。但是,我不确定与仅迭代列表和转换对象相比,这有多高效或多快。 .ConvertAll 是否使用任何特殊方法来加速转换过程,或者它只是转换列表而无需设置循环的快捷方式?
没有比直接访问源代码更好的方法来找出答案了:)
http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs#dbcc8a668882c0db 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
.
- 它可以在all
IEnumerable<T>
, while ConvertAll
仅适用于以下实例List<T>
。不管它是数组、列表还是字典,Select
与他们所有人一起工作。
-
Select
很懒。在您迭代它之前它不会执行任何操作。这意味着它返回一个IEnumerable<TOutput>
然后您可以通过调用将其转换为列表ToList()
或者如果你实际上不这样做need一个列表。或者,如果您只想转换并检索一百万个项目列表中的前两项,您可以简单地执行以下操作source.Select(input => new Something(input.Name)).Take(2)
.
但是,如果您的问题纯粹是关于将整个列表转换为另一个列表的性能,那么ConvertAll
可能会更快一些,因为它比Select
随后是一个ToList
(它知道列表有一个大小,并且可以通过索引直接从底层数组访问元素)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)