2010-08-02 16 views
11

¿Cómo puedo convertir/volcar una lista de arrays en una lista? Estoy usando una lista de arrays porque estoy usando la función de perfiles ASP.NET y me pareció complicado almacenar la Lista en los perfiles.Listado de materiales a la lista <t>?

Nota: La otra opción sería envolver la Lista en una clase propia y terminar con ArrayList.

http://www.ipreferjim.com/site/2009/04/storing-generics-in-asp-net-profile-object/

+0

duplicado posible de [En .Net, ¿cómo convertir un ArrayList a una lista genérica inflexible sin utilizar un foreach ?]] (http://stackoverflow.com/questions/786268/in-net-how-do-you-convert-an-arraylist-to-a-strongly-typed-generic-list-withou) –

Respuesta

24

La forma más fácil de convertir un ArrayList llena de objetos de tipo T sería esto (suponiendo que está utilizando .NET 3.5 o mayor):

List<T> list = arrayList.Cast<T>().ToList(); 

Si está utilizando 3.0 o anterior, usted tiene que bucle de sí mismo:

List<T> list = new List<T>(arrayList.Count); 

foreach(T item in arrayList) list.Add(item); 
+1

En .NET 3.0 o antes, podría usar 'List list = new List ((T []) arrayList.ToArray())' . Esto se basa en la covarianza de arrays en .NET, pero es menos eficiente ya que crea una copia extra de los datos. – LBushkin

+0

Si ArrayList es una mezcla de tipos de objeto, use 'OfType ()' en lugar de 'Cast ()'. (.NET 3.5 o superior) –

+0

@LBushkin, no pude hacerlo funcionar sin utilizar la sobrecarga de tipo 'ToArray' para devolver una base' Array'. Funciona todo el día con 'new List ((T []) arrayList.ToArray (typeof (T)))' – Marc

4

usted puede utilizar LINQ si está utilizando .NET 3.5 o superior. using System.Linq;

ArrayList arrayList = new ArrayList(); 
arrayList.Add(1); 
arrayList.Add("two"); 
arrayList.Add(3); 

List<int> integers = arrayList.OfType<int>().ToList(); 

De lo contrario, tendrá que copiar todos los valores a una nueva lista.

+0

gracias: D conversión de una línea era lo que estaba buscando –

2
ArrayList a = new ArrayList(); 

object[] array = new object[a.Count]; 

a.CopyTo(array); 

List<object> list = new List<object>(array); 

De lo contrario, vas a tener que hacer un bucle sobre su arrayList y añadirlo a la nueva lista.

+2

o convertir esto en un trazador de líneas, si quería objeto 'nueva lista (a.ToArray());' – Marc

+0

... parece un poco largo sin aliento para mí . – spender

+0

@Marc: podría usar List y aún así mantenerlo como un oneliner confiando en [array covariance] (http://msdn.microsoft.com/en-us/library/aa664572 (VS.71% 29.aspx) en C#: 'nueva lista ((T []) a.ToArray());' – LBushkin

0

Esto funciona en el marco < 3.5 también:

Dim al As New ArrayList() 
al.Add(1) 
al.Add(2) 
al.Add(3) 
Dim newList As New List(Of Int32)(al.ToArray(GetType(Int32))) 

C#

List<int> newList = new List<int>(al.ToArray(typeof(int))); 
Cuestiones relacionadas