2010-08-24 8 views
6

Tengo un método de terceros que devuelve un ArrayList antiguo, y quiero convertirlo en un ArrayList mecanografiado (Of MyType).VB.NET ArrayList a List (Of T) copy/conversion mecanografiado

Dim udc As ArrayList = ThirdPartyClass.GetValues() 
Dim udcT AS List(Of MyType) = ?? 

me han hecho un bucle simple, pero tiene que haber una mejor manera:

Dim udcT As New List(Of MyType) 
While udc.GetEnumerator.MoveNext 
    Dim e As MyType = DirectCast(udc.GetEnumerator.Current, MyType) 
    udcT.Add(e) 
End While 
+1

Si bien puede encontrar un código más bonito, siempre sabrá exactamente lo que está haciendo este código. Y es probablemente lo que CLR está haciendo debajo de todos modos. – Bill

+0

@Bill Creí que el CLR podría optimizar, quizás usando variables internas a las que no tengo acceso. – vulkanino

Respuesta

17
Dim StronglyTypedList = OriginalArrayList.Cast(Of MyType)().ToList() 
' requires `Imports System.Linq` 
+0

Cast no es miembro de ArrayList – vulkanino

+0

@vulkanino: Sí, es un * método de extensión *. Como dije, requiere que se incluya el espacio de nombres System.Linq en la unidad de compilación actual. –

+0

Lo siento, no vi la parte "requiere". De todos modos, no quiero incluir a Linq solo para ese elenco. :) – vulkanino

0

Duplicar. un vistazo a este SO-Tema: In .Net, how do you convert an ArrayList to a strongly typed generic list without using a foreach?

en VB.Net con Marco < 3.5:

Dim arrayOfMyType() As MyType = DirectCast(al.ToArray(GetType(MyType)), MyType()) 
Dim strongTypeList As New List(Of MyType)(arrayOfMyType) 
+0

esta solución es concisa pero crea una matriz "estándar" temporal. – vulkanino

+0

@Vulkanino: puede escribirlo en una línea, pero sin métodos de extensión debe crear una matriz implícitamente con toArray o llenar la lista en un bucle. Por lo tanto, siempre es caro y no se puede usar repetitivo. –

0

¿Y esto?

Public Class Utility 

    Public Shared Function ToTypedList(Of C As {ICollection(Of T), New}, T)(ByVal list As ArrayList) As C 

     Dim typedList As New C 
     For Each element As T In list 
      typedList.Add(element) 
     Next 

     Return typedList 
    End Function 

End Class 

Si funciona para cualquier objeto Collection.

0

Me gustaría señalar algo acerca de DirectCast y System.Linq.Cast (que son lo mismo en el último .NET al menos.) Estos pueden no funcionar si el tipo de objeto en la matriz está definido por la clase de usuario, y no es fácilmente convertible en tipos de objetos que .NET reconoce. No sé por qué este es el caso, pero parece ser el problema en el software para el que estoy desarrollando, por lo que para estos nos hemos visto obligados a utilizar la solución de bucle poco elegante.

Cuestiones relacionadas