我有一些清单:
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();
这两种方法有什么区别?
ConvertAll不是扩展,而是列表类中的方法。你不必在结果上调用 ToList,因为它已经是一个列表:
ConvertAll
ToList
List<int> list2 = list.ConvertAll(x => 2 * x);
所以,区别在于 ConvertAll方法只能用于列表,并且它返回一个列表。Select方法可以用于实现 IEnumerable<T>接口的任何集合,并且它返回一个 IEnumerable<T>。
Select
IEnumerable<T>
而且,他们的处理方式不同,所以在不同的情况下他们有自己的优势。ConvertAll方法遍历列表并一次性创建一个新列表,而 Select方法使用延迟执行,只在需要时处理项目。如果不需要所有项,则 Select方法更有效。另一方面,一旦 ConvertAll返回了列表,您就不需要保留原始列表。
Select是一个 LINQ 扩展方法,适用于所有 IEnumerable<T>对象,而 ConvertAll仅由 List<T>实现。ConvertAll方法存在于。NET 2.0,而 LINQ 是在3.5中引入的。
List<T>
你应该支持 Select而不是 ConvertAll,因为它适用于任何类型的列表,但它们基本上是一样的。
我知道这是有点晚,但我仍然添加,因为这可能是一些有用的其他在未来。
在 EntityFramework 查询表达式中使用它时,不建议在计算表达式时使用 ConvertAll () ,而是将其作为表达式留待将来使用。这会严重降低数据库查询的执行性能,因为在计算最终表达式之前,它必须进行多次调用。
第一个答案不应该是被接受的,我是一个前2007 C # 微软 MVP。
与可接受的反应相比,ConvertAll比 Select和 ToList()的组合更有效。
ToList()
首先,ConvertAll严格地说是更快的,而且它使用了最小的内存量。和 Array 一样。ConvertAll 与 Select 和 ToArray。如果在一个循环中使用更大的长度数组或者更多的调用,这种情况将会更加明显。
1) ConvertAll知道最终列表的大小,避免重新分配基数组。ToList()将多次调整数组大小。
2) ToList将发出较慢的接口 IEnumerable<>调用,而 ConvertAll将循环通过底层数组,不需要额外的调用或范围检查。
IEnumerable<>
3) Select 将创建一个额外的 IEnumerable<T>对象。