2010-01-18 21 views
22

Tengo un List<int> y quiero convertirlo a List<double>. ¿Hay alguna manera de hacer esto que no sea sólo un bucle a través del List<int> y la adición de un nuevo List<double> así:C# Converting List <int> en la lista <double>

List<int> lstInt = new List<int>(new int[] {1,2,3}); 
List<double> lstDouble = new List<double>(lstInt.Count);//Either Count or Length, I don't remember 

for (int i = 0; i < lstInt.Count; i++) 
{ 
    lstDouble.Add(Convert.ToDouble(lstInt[0])); 
} 

¿Hay una forma elegante de hacer esto? Estoy usando C# 4.0, por lo que la respuesta puede aprovechar las nuevas características del lenguaje.

+0

(para el registro, tenga en cuenta que la variación de C# 4.0 no funcionará en tipos concretos ('List '), no funcionará en listas en general ('IList '), y no funcionará entre 'int' y 'doble') –

Respuesta

28

puede utilizar métodos de LINQ:

List<double> doubles = integers.Select<int, double>(i => i).ToList(); 

o:

List<double> doubles = integers.Select(i => (double)i).ToList(); 

Además, la clase lista tiene una ParaCualquier método:

List<double> doubles = new List<double>(integers.Count); 
integers.ForEach(i => doubles.Add(i)); 
+0

Esto debe seleccionarse (i => i) .ToList(); ¿Hay alguna forma de utilizar la sintaxis <,> con una variable 'Tipo' en lugar de int? – Ames

+1

@Chris: En realidad, normalmente sería simplemente 'enteros.Seleccione (i => (doble) i)' para ser idiomático. Pero no, los genéricos son una característica de tiempo de compilación: si desea utilizar un tipo conocido solo en el momento de la ejecución, deberá usar el reflejo. La tipificación dinámica en C# 4 puede ayudarte con eso, pero tendrías que dar un ejemplo más concreto antes de poder decirlo con certeza. –

+0

Usando la segunda demostración, puedo crear una lista de reflexión de tipo double, luego usar las cosas de foreach para agregar elementos de la lista basada en int. La promoción ocurrirá y todo lo feliz sucederá. Esta respuesta en realidad resolvió mi problema, pero las anteriores son más concisas a la pregunta que hice. – Ames

8

Usted puede hacer esto utilizando el método Select extensión:

List<double> doubleList = intList.Select(x => (double)x).ToList(); 
+0

pero sigue siendo un bucle bajo las sábanas, ¿verdad? –

+0

@Mitch Wheat, eso es correcto. –

+0

Entonces, ¿tiene algún sentido no solo usar un bucle? ¿En cuanto al rendimiento? – Ames

49

Usted puede uso Select según lo sugerido por otros, pero también se puede utilizar ConvertAll:

List<double> doubleList = intList.ConvertAll(x => (double)x); 

Esto tiene dos ventajas:

  • No requiere LINQ, así que si estás usando .NET 2.0 y no quieres usar LINQBridge, aún puedes usarlo.
  • Es más eficiente: el método ToList no conoce el tamaño del resultado de Select, por lo que puede necesitar reasignar almacenamientos intermedios a medida que avanza. ConvertAll conoce el tamaño de origen y destino, por lo que puede hacerlo todo de una vez. También puede hacerlo sin la abstracción de los iteradores.

Las desventajas:

  • Sólo funciona con List<T> y matrices. Si obtiene un simple IEnumerable<T>, tendrá que usar Select y ToList.
  • Si usa LINQ en su proyecto, puede ser más consistente seguir usándolo aquí también.
+1

y disponible también en .NET 3.5 –

+0

¿No es ConvertAll solo un contenedor para la expresión LINQ? –

+0

¿Hay alguna diferencia con Select, excepto que muestra más claramente su intención? – VVS

0

Puede usar Seleccionar o Convertir todo. Tenga en cuenta que ConvertAll está disponible en .Net 2.0 también

2

puede utilizar el método ConvertAll interior de .Net Framework 2.0 que aquí es un ejemplo

 List<int> lstInt = new List<int>(new int[] { 1, 2, 3 }); 
     List<double> lstDouble = lstInt.ConvertAll<double>(delegate(int p) 
     { 
      return (double)p; 
     }); 
1

Se puede utilizar un grupo Método:

lstDouble = lstInt.Select(Convert.ToDouble) 
Cuestiones relacionadas