C#List .ConvertAll效率和开销

mBr*_*024 5 c# performance list convertall

我最近了解了List的.ConvertAll扩展.我今天在代码中使用它几次,将我的对象的大型列表转换为其他对象的列表.它似乎工作得很好.但是,我不确定这与仅迭代列表和转换对象相比有多快或多快..ConvertAll是否会使用任何特殊的东西来加速转换过程,或者它只是一种简单的转换列表而无需设置循环的方法?

Jul*_*anR 9

没有更好的方法来找出比直接去源,字面意思:)

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(它知道列表有一个大小并且可以通过索引直接访问元素)例如,从底层数组).