2010-12-14 9 views
5

Tengo ArrayList de tipo BookingData en List<BookingData>?¿Cuál es la mejor forma de transmitir desde ArrayList a List en .Net 2.0

Estoy usando .net 2.0, así que no puedo usar arrayList.Cast<int>().ToList(), y no quiero hacer aquí foreach loop, ¿tiene mejores ideas?

Gracias.

+0

En C# que realmente necesita para echar '' ArrayList' a list'? – khachik

+0

@khachik: 'ArrayList' es del tipo' Object' y 'List' es un tipo genérico. – Bobby

+0

@khachik, ambas son clases concretas en C#. –

Respuesta

11

tenga en cuenta que algo va a tener que enumerar la lista de arreglo para construir el List<T>; es solo cuestión de si lo haces tú mismo o lo dejas a algún otro método (marco/utilidad).

  1. Si esto es un hecho aislado, la solución que se desea evitar (mediante un "in-situ" foreach bucle para hacer la conversión) es una opción perfectamente razonable. Si te encuentras haciendo esto bastante a menudo, puedes extraerlo en un método de utilidad genérico, como en la respuesta de cdhowie.

  2. Si su única restricción es que debe objetivo .NET 2.0 (pero puede utilizar C# 3), considere LINQBridge, que es una reimplementación de LINQ a Objetos para .NET 2.0. Esto le permitirá usar la muestra Cast que proporcionó sin cambios. También funcionará en C# 2, pero no obtendrá los beneficios de la sintaxis del método de extensión, una mejor inferencia de tipos, etc.

  3. Si no le importa el rendimiento, ni quiere ir a la molestia de escribir un método de utilidad, se puede utilizar el incorporado ArrayList.ToArray método para ayudar a cabo, mediante la creación de una matriz intermediario que juega bien con List<T> (esto no es todo lo que más corto que un foreach):


ArrayList arrayList = ... 

// Create intermediary array 
BookingData[] array = (BookingData[]) arrayList.ToArray(typeof(BookingData)); 

// Create the List<T> using the constructor that takes an IEnumerable<T> 
List<BookingData> list = new List<BookingData>(array); 

Finalmente, sugeriría, si es posible, abandonar el uso de las clases de colección no genéricas obsoletas.

+2

Solo para su información, este método creará una matriz intermedia innecesaria. – cdhowie

1

El uso de este método:

public static List<T> ConvertToList<T>(ArrayList list) 
{ 
    if (list == null) 
     throw new ArgumentNullException("list"); 

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

    foreach (object obj in list) 
     newList.Add((T)obj); 

    // If you really don't want to use foreach: 
    // for (int i = 0; i < list.Count; i++) 
    //  newList.Add((T)list[i]); 

    return newList; 
} 

A continuación, se puede:

List<BookingData> someList = ConvertToList<BookingData>(someArrayList); 
+0

. El compilador .NET 2.0 no admite los métodos de extensión y var. – TToni

+0

@TToni: Cierto. Sin embargo, esa es solo una diferencia sintáctica. Lo arreglaré. – cdhowie

+0

Sin embargo, la lógica del código es la misma. –

0

usted tiene que utilizar foreach:

 foreach (Object item in list1) 
     { 
      list2.Add((BookingData)item); 
     } 
+0

¿Tiene * que usar foreach? Nada más va a funcionar? – cdhowie

+0

Cualquier 'otra construcción de bucle' ... Pero tienes que recorrerlo. – decyclone

2

Vamos a mantenerlo simple:

// untested 
List<T> ConvertArrayList<T>(ArrayList data) 
{ 
    List<T> result = new List<T> (data.Count); 
    foreach (T item in data) 
     result.Add(item); 
    return result; 
} 

... 

List<BookingData> newList = ConvertArrayList<BookingData>(oldList); 
+0

Tienes que convertir 'item' en' T'. – cdhowie

+3

@cdhowie: Si la memoria sirve al foreach, eso hará. Viejo vudú Fx2. –

+0

Oh, cierto. Siempre me olvido de los juegos implícitos como ese. – cdhowie

0

ToList() método no es más que el azúcar sintético para crear una representación de lista pero internamente también está utilizando bucle para generar el elemento de la lista.

por lo que es mucho más limpio y más fácil de usar un bloque foreach iterador.

Cuestiones relacionadas