2010-08-24 13 views
6

Ho un metodo di terze parti che restituisce un ArrayList vecchio stile e voglio convertirlo in un ArrayList tipizzato (Of MyType).VB.NET ArrayList su List (Of T) copia/conversione digitata

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

ho fatto un semplice ciclo, ma ci deve essere un modo migliore:

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

Mentre è possibile trovare codice più carino, si saprà sempre esattamente cosa sta facendo questo codice. Ed è probabilmente ciò che il CLR sta facendo sotto comunque. – Bill

+0

@Bill Ho pensato che il CLR potesse ottimizzare, magari usando variabili interne a cui non ho accesso. – vulkanino

risposta

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

Cast non è un membro di ArrayList – vulkanino

+0

@vulkanino: Sì, è un * metodo di estensione *. Come ho detto, richiede lo spazio dei nomi System.Linq da includere nell'unità di compilazione corrente. –

+0

Siamo spiacenti, non ho visto la parte "richiede". Comunque non voglio includere Linq solo per quel cast. :) – vulkanino

0

duplicati. Date un'occhiata a questo SO-Discussione: In .Net, how do you convert an ArrayList to a strongly typed generic list without using a foreach?

in VB.Net con Framework 3.5 <:

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

questa soluzione è concisa ma crea una matrice "standard" temporanea. – vulkanino

+0

@Vulkanino: è possibile scriverlo in una riga, ma senza i metodi di estensione è necessario creare una matrice implicitamente con toArray o riempire l'elenco in un ciclo. Quindi è sempre costoso e non può essere utilizzato ripetitivo. –

0

Che dire di questo?

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 

Se funzionasse per qualsiasi oggetto Collection.

0

Vorrei sottolineare qualcosa sia su DirectCast che su System.Linq.Cast (che sono la stessa cosa almeno nell'ultimo .NET.) Questi potrebbero non funzionare se il tipo di oggetto nell'array è definito da la classe utente e non è facilmente convertibile in tipi di oggetto riconosciuti da .NET. Non so perché questo sia il caso, ma sembra che il problema sia nel software per il quale sto sviluppando, e quindi per questi siamo stati costretti a usare la soluzione inelegante del ciclo.

Problemi correlati