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:
Select
es un método de extensión LINQ y funciona en todos losIEnumerable<T>
objetos, mientrasConvertAll
que solo lo implementaList<T>
. ElConvertAll
método existe desde .NET 2.0, mientras que LINQ se introdujo con 3.5.Usted debe favorecer
Select
másConvertAll
, ya que funciona para cualquier tipo de lista, pero lo hacen básicamente el mismo.fuente
Select
yConvertAll
. 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.ConvertAll
no es una extensión, es un método en la clase list. No tiene que llamarToList
al resultado porque ya es una lista:Entonces, la diferencia es que el
ConvertAll
método solo se puede usar en una lista y devuelve una lista. ElSelect
mé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
ConvertAll
método recorre la lista y crea una nueva lista de una sola vez, mientras que elSelect
método utiliza la ejecución diferida y solo procesa los elementos cuando los necesita. Si no necesita todo el artículo, elSelect
método es más eficiente. Por otro lado, una vez queConvertAll
haya 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,
ConvertAll
es mucho más eficiente que la combinación deSelect
yToList()
.En primer lugar,
ConvertAll
es 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)
ConvertAll
conoce 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)
ToList
haráIEnumerable<>
llamadas de interfaz más lentas , mientrasConvertAll
que 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
ConvertAll
es un métodoList<T>
. Para cuando tenga la lista, ya habrá evaluado su expresión. Pero tienes razón: si no quieres evaluar todo,Select
es preferible.