2009-04-24 15 views
52

Vea el ejemplo de código a continuación. Necesito el ArrayList para ser una lista genérica.En .Net, ¿cómo se convierte una ArrayList en una lista genérica fuertemente tipada sin utilizar un foreach?

ArrayList arrayList = GetArrayListOfInts(); 
List<int> intList = new List<int>(); 

//Can this foreach be condensed into one line? 
foreach (int number in arrayList) 
{ 
    intList.Add(number); 
} 
return intList;  
+0

En caso de que no están seguros de que arrayList contiene sólo los tipos esperados, filtrarlos arrayList.OfType () .ToList(). Ver http://stackoverflow.com/a/7845009/52277 –

Respuesta

102

intente lo siguiente

var list = arrayList.Cast<int>().ToList(); 

esto sólo funcionará aunque usando el compilador de C# 3.5, ya que se aprovecha de ciertos métodos de extensión definidos en el marco 3.5.

+0

Aunque ciertamente he usado esto antes que yo, estoy considerando boxear/unboxing. ¿No se retractará eso del rendimiento? A veces me parece que el código bonito es a expensas de la velocidad y los recursos ... –

+6

Eso es solo una consecuencia de ponerlo en una ArrayList en primer lugar. Solo devolver a cada miembro a un int es casi lo mejor que puedes hacer en cuanto a rendimiento. – mquander

+0

@mquander, cierto, cierto ... Me acabo de dar cuenta de que el for-loop en la publicación de OP también hace eso. =) –

9

Esto es ineficiente (hace una matriz intermedio innecesariamente), pero es conciso y funcionará en .NET 2.0:

List<int> newList = new List<int>(arrayList.ToArray(typeof(int))); 
+0

¿Por qué esto no funciona para mí? –

+5

Hice 'arrayList.ToArray (typeof (int)) como int []' y luego funcionó gracias! +1 –

4

Cómo sobre el uso de un método de extensión?

De http://www.dotnetperls.com/convert-arraylist-list:

using System; 
using System.Collections; 
using System.Collections.Generic; 

static class Extensions 
{ 
    /// <summary> 
    /// Convert ArrayList to List. 
    /// </summary> 
    public static List<T> ToList<T>(this ArrayList arrayList) 
    { 
     List<T> list = new List<T>(arrayList.Count); 
     foreach (T instance in arrayList) 
     { 
      list.Add(instance); 
     } 
     return list; 
    } 
} 
Cuestiones relacionadas