首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#中Select和ConvertAll的区别

C#中Select和ConvertAll的区别
EN

Stack Overflow用户
提问于 2009-10-15 11:35:17
回答 4查看 47.7K关注 0票数 150

我有一些清单:

代码语言:javascript
复制
List<int> list = new List<int> { 1, 2, 3, 4, 5 };

我想对列表中的元素应用一些转换。我可以通过两种方式完成此操作:

代码语言:javascript
复制
List<int> list1 = list.Select(x => 2 * x).ToList();
List<int> list2 = list.ConvertAll(x => 2 * x).ToList();

这两种方式有什么不同?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-10-15 11:39:45

Select是一种LINQ扩展方法,适用于所有IEnumerable<T>对象,而ConvertAll仅由List<T>实现。ConvertAll方法从LINQ2.0开始就存在了,而.NET是在3.5版本中引入的。

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

票数 142
EN

Stack Overflow用户

发布于 2009-10-15 11:38:58

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

代码语言:javascript
复制
List<int> list2 = list.ConvertAll(x => 2 * x);

因此,不同之处在于ConvertAll方法只能用于列表,并且它返回一个列表。Select方法可用于任何实现IEnumerable<T>接口的集合,并返回一个IEnumerable<T>

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

票数 100
EN

Stack Overflow用户

发布于 2019-04-11 12:50:42

第一个答案不应该是被接受的答案。我是微软2007年的C#最有价值球员。

与接受的响应相比,ConvertAllSelectToList()的组合效率高得多。

首先,ConvertAll速度更快,并且使用最少的内存来完成此任务。与Array.ConvertAll和ToArray相同。对于长度较大的数组或循环中的多个调用,这一点会更加明显。

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

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

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

票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1571819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档