Tengo alguna lista:
List<int> list = new List<int> { 1, 2, 3, 4, 5 };
Quiero aplicar alguna transformación a los elementos de mi lista. Puedo hacer esto de dos formas:
List<int> list1 = list.Select(x => 2 * x).ToList();
List<int> list2 = list.ConvertAll(x => 2 * x).ToList();
¿Cuál es la diferencia entre estas dos formas?

Respuestas:
Selectes un método de extensión LINQ y funciona en todos losIEnumerable<T>objetos, mientrasConvertAllque solo lo implementaList<T>. ElConvertAllmétodo existe desde .NET 2.0, mientras que LINQ se introdujo con 3.5.Usted debe favorecer
SelectmásConvertAll, ya que funciona para cualquier tipo de lista, pero lo hacen básicamente el mismo.fuente
SelectyConvertAll. El primero selecciona cada elemento en una secuencia y usted es libre de hacer lo que quiera con él. Este último tiene una intención clara: convertir este artículo en otra cosa.ConvertAllno es una extensión, es un método en la clase list. No tiene que llamarToListal resultado porque ya es una lista:Entonces, la diferencia es que el
ConvertAllmétodo solo se puede usar en una lista y devuelve una lista. ElSelectmétodo se puede utilizar en cualquier colección que implemente laIEnumerable<T>interfaz y devuelve unIEnumerable<T>.Además, hacen el procesamiento de manera diferente, por lo que tienen sus puntos fuertes en diferentes situaciones. El
ConvertAllmétodo recorre la lista y crea una nueva lista de una sola vez, mientras que elSelectmétodo utiliza la ejecución diferida y solo procesa los elementos cuando los necesita. Si no necesita todo el artículo, elSelectmétodo es más eficiente. Por otro lado, una vez queConvertAllhaya devuelto la lista, no es necesario que conserve la lista original.fuente
Select.La primera respuesta no debería ser la aceptada. Soy un ex MVP de Microsoft C # 2007.
En contraste con la respuesta aceptada,
ConvertAlles mucho más eficiente que la combinación deSelectyToList().En primer lugar,
ConvertAlles estrictamente más rápido y utiliza la cantidad mínima de memoria para hacerlo. Igual que Array.ConvertAll vs Select y ToArray. Esto sería mucho más evidente con una matriz de mayor longitud o muchas llamadas dentro de un bucle.1)
ConvertAllconoce el tamaño de la lista final y evita reasignar la matriz base.ToList() seguirá cambiando el tamaño de la matriz varias veces.2)
ToListharáIEnumerable<>llamadas de interfaz más lentas , mientrasConvertAllque recorrerá la matriz subyacente sin llamadas adicionales o comprobaciones de rango.3) Seleccionar creará un
IEnumerable<T>objeto adicional .fuente
Sé que esto es un poco tarde, pero aún lo he agregado porque esto podría ser de alguna utilidad para otros en el futuro.
Cuando se usa en la expresión de consulta EntityFramework, no se recomienda usar ConvertAll () ya que evalúa la expresión en lugar de dejarla como expresión para uso futuro. Esto degrada seriamente el rendimiento de ejecución de la consulta de la base de datos, ya que tendría que realizar un número de llamadas antes de evaluar la expresión final.
fuente
ConvertAlles un métodoList<T>. Para cuando tenga la lista, ya habrá evaluado su expresión. Pero tienes razón: si no quieres evaluar todo,Selectes preferible.