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式之前,必须进行多次调用。