C # 中 Select 与 ConvertAll 的区别

我有一些清单:

List<int> list = new List<int> { 1, 2, 3, 4, 5 };

我想对列表中的元素应用一些转换,有两种方法:

List<int> list1 = list.Select(x => 2 * x).ToList();
List<int> list2 = list.ConvertAll(x => 2 * x).ToList();

这两种方法有什么区别?

54136 次浏览

ConvertAll不是扩展,而是列表类中的方法。你不必在结果上调用 ToList,因为它已经是一个列表:

List<int> list2 = list.ConvertAll(x => 2 * x);

所以,区别在于 ConvertAll方法只能用于列表,并且它返回一个列表。Select方法可以用于实现 IEnumerable<T>接口的任何集合,并且它返回一个 IEnumerable<T>

而且,他们的处理方式不同,所以在不同的情况下他们有自己的优势。ConvertAll方法遍历列表并一次性创建一个新列表,而 Select方法使用延迟执行,只在需要时处理项目。如果不需要所有项,则 Select方法更有效。另一方面,一旦 ConvertAll返回了列表,您就不需要保留原始列表。

Select是一个 LINQ 扩展方法,适用于所有 IEnumerable<T>对象,而 ConvertAll仅由 List<T>实现。ConvertAll方法存在于。NET 2.0,而 LINQ 是在3.5中引入的。

你应该支持 Select而不是 ConvertAll,因为它适用于任何类型的列表,但它们基本上是一样的。

我知道这是有点晚,但我仍然添加,因为这可能是一些有用的其他在未来。

在 EntityFramework 查询表达式中使用它时,不建议在计算表达式时使用 ConvertAll () ,而是将其作为表达式留待将来使用。这会严重降低数据库查询的执行性能,因为在计算最终表达式之前,它必须进行多次调用。

第一个答案不应该是被接受的,我是一个前2007 C # 微软 MVP。

与可接受的反应相比,ConvertAllSelectToList()的组合更有效。

首先,ConvertAll严格地说是更快的,而且它使用了最小的内存量。和 Array 一样。ConvertAll 与 Select 和 ToArray。如果在一个循环中使用更大的长度数组或者更多的调用,这种情况将会更加明显。

1) ConvertAll知道最终列表的大小,避免重新分配基数组。ToList()将多次调整数组大小。

2) ToList将发出较慢的接口 IEnumerable<>调用,而 ConvertAll将循环通过底层数组,不需要额外的调用或范围检查。

3) Select 将创建一个额外的 IEnumerable<T>对象。