我有一些清单:
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();
这两种方式有什么不同?
发布于 2009-10-15 03:39:45
Select
是一种LINQ扩展方法,适用于所有IEnumerable<T>
对象,而ConvertAll
仅由List<T>
实现。ConvertAll
方法从LINQ2.0开始就存在了,而.NET是在3.5版本中引入的。
你应该更喜欢Select
而不是ConvertAll
,因为它适用于任何类型的列表,但它们基本上做的是一样的。
发布于 2009-10-15 03:38:58
ConvertAll
不是一个扩展,它是list类中的一个方法。你不必对结果调用ToList
,因为它已经是一个列表了:
List<int> list2 = list.ConvertAll(x => 2 * x);
因此,不同之处在于ConvertAll
方法只能用于列表,并且它返回一个列表。Select
方法可用于任何实现IEnumerable<T>
接口的集合,并返回一个IEnumerable<T>
。
此外,它们的处理方式也不同,因此它们在不同的情况下都有自己的优势。ConvertAll
方法遍历列表并一次性创建一个新列表,而Select
方法使用延迟执行,只在需要时处理项。如果您不需要所有的项,那么Select
方法更有效。另一方面,一旦ConvertAll
返回了列表,您就不需要保留原始列表。
发布于 2019-04-11 04:50:42
第一个答案不应该是被接受的答案。我是微软2007年的C#最有价值球员。
与接受的响应相比,ConvertAll
比Select
和ToList()
的组合效率高得多。
首先,ConvertAll
速度更快,并且使用最少的内存来完成此任务。与Array.ConvertAll和ToArray相同。对于长度较大的数组或循环中的多个调用,这一点会更加明显。
1) ConvertAll
知道最终列表的大小,并避免重新分配基数组。ToList
()会多次调整数组的大小。
2) ToList
将进行较慢的接口IEnumerable<>
调用,而ConvertAll
将在底层数组中循环,而不需要额外的调用或范围检查。
3)选择将创建一个额外的IEnumerable<T>
对象。
https://stackoverflow.com/questions/1571819
复制相似问题