使用ToList()与新列表(IEnumerable <T>)之间的性能差异

Lor*_*haw 7 c#

我很好奇在IEnumerable上使用ToList()而不仅仅是调用List Constructor'List(IEnumerable)'对性能的影响.

例:

int[] testArray = new int[10];
var list = testArray.ToList();
Run Code Online (Sandbox Code Playgroud)

int[] testArray = new int[10];
var list = new List<int>(testArray);
Run Code Online (Sandbox Code Playgroud)

使用其中一个是否有任何性能影响或最佳实践?

我已经接管了一个应用程序,我正在调用的控制器方法返回一个数组,但我所拥有的视图是一个List.

svi*_*ick 7

像其他人已经说过的那样,大多数时候最好的做法是做一些更具可读性的东西(我认为这意味着使用ToList()).两种方式完全相同,所以你应该期望它们的性能非常相似.

如果分析显示这是您需要优化的代码,那么您应该尝试两种方式并测量哪一种更快.

查看源代码(在.Net基本库的情况下,您可以查看Reference Source或使用反编译器)也可能有所帮助.ToList看起来像这样:

public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source) {
    if (source == null) throw Error.ArgumentNull("source");
    return new List<TSource>(source);
}
Run Code Online (Sandbox Code Playgroud)

因此,它的性能应该与new List一个null检查和一个方法调用相同.但两种增加都可能会被优化掉.

  • 包含throw语句的方法不会被优化掉.对异常的堆栈跟踪太破坏性了. (2认同)