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(); 

这两种方式有什么区别?

Select是一种LINQ扩展方法,适用于所有IEnumerable<T>对象,而ConvertAll仅由List<T>ConvertAll方法从.NET 2.0开始存在,而LINQ则是在3.5开始的。

您应该赞成Select over ConvertAll因为它适用于任何types的列表,但基本上都是这样。

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

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

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

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

我知道这有点晚了,但我还是补充说,因为这可能会在未来用于其他人。

在EntityFramework查询expression式中使用它时,不build议使用ConvertAll()来评估expression式,而不是将其作为expression式使用。 这严重降低了数据库查询执行的性能,因为在评估最终expression式之前,必须进行多次调用。