2010-08-24 111 views
6

我有一個第三方方法返回一箇舊式的ArrayList,我想將它轉換成一個類型化的ArrayList(Of MyType)。VB.NET ArrayList to List(of T)打字複製/轉換

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

我做了一個簡單的循環,但必須有一個更好的辦法:

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

雖然您可能會發現更漂亮的代碼,但您始終可以確切知道此代碼正在做什麼。無論如何,這可能是CLR正在做的事情。 – Bill 2010-08-24 11:43:22

+0

@ Bill我認爲CLR可以優化,也許使用我無法訪問的內部變量。 – vulkanino 2010-08-24 11:49:26

回答

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

演員不是ArrayList的成員 – vulkanino 2010-08-24 11:45:33

+0

@vulkanino:是的,這是一個*擴展方法*。正如我所說的,它需要將System.Linq命名空間包含在當前編譯單元中。 – 2010-08-24 11:51:35

+0

對不起,我沒有看到「要求」部分。無論如何,我不想只包含Linq。 :) – vulkanino 2010-08-24 11:57:04

0

重複。 看一看這個所謂的主題:In .Net, how do you convert an ArrayList to a strongly typed generic list without using a foreach?

在VB.Net與框架< 3.5:

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

這個解決方案簡潔但創建一個臨時的「標準」數組來調用方法。 – vulkanino 2010-08-24 11:50:35

+0

@Vulkanino:你可以把它寫在一行中,但沒有擴展方法,你必須用toArray隱式地創建一個數組,或者在循環中填充列表。因此,它總是很昂貴,可能不會被重複使用。 – 2010-08-24 12:02:21

0

這個是什麼?

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 

如果適用於任何Collection對象。

0

我想指出一些關於DirectCast和System.Linq.Cast(至少在最新的.NET中是同樣的東西)。如果數組中的對象類型是由用戶類,並且不容易轉換爲.NET可識別的對象類型。我不知道爲什麼會出現這種情況,但它似乎是我正在開發的軟件中的問題,因此我們不得不使用不合適的循環解決方案。