VB.NET ArrayList到列表(共T个)键入的复制/转换

VB.NET ArrayList到列表(共T个)键入的复制/转换,vb.net,type-conversion,Vb.net,Type Conversion,我有一个第三方方法返回一个老式的ArrayList,我想将它转换成一个类型化的ArrayList(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 重复。 请看一下这个S

我有一个第三方方法返回一个老式的ArrayList,我想将它转换成一个类型化的ArrayList(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
重复。 请看一下这个SO线程:

在框架<3.5的VB.Net中:

Dim arrayOfMyType() As MyType = DirectCast(al.ToArray(GetType(MyType)), MyType())
Dim strongTypeList As New List(Of MyType)(arrayOfMyType)
这个怎么样

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

If适用于任何集合对象。

我想指出有关DirectCast和System.Linq.Cast的一些内容(至少在最新的.NET中是相同的)。如果数组中的对象类型是由用户类定义的,并且不容易转换为.NET可识别的对象类型,则这些可能不起作用。我不知道为什么会出现这种情况,但这似乎是我正在开发的软件中的问题,因此对于这些问题,我们不得不使用不雅观的循环解决方案

虽然您可能会发现更漂亮的代码,但您总是确切地知道该代码在做什么。不管怎样,这可能就是CLR在下面做的事情。@Bill我认为CLR可以优化,也许可以使用我无权访问的内部变量。Cast不是ArrayList@vulkanino:是的,这是一种扩展方法。正如我所说,它要求在当前编译单元中包含System.Linq命名空间。抱歉,我没有看到“requires”部分。无论如何,我不想只为那个演员加入Linq.:)@除非你们并没有引用系统。核心组件放在首位,不“包括”Linq是不合理的。这只是一堆C#特性的名称。这是一种简单的C#方法,并且不会有很大的开销。您也可以使用
System.Linq.Enumerable.ToList(System.Linq.Enumerable.Cast(MyType)(originAlarArrayList))直接调用该方法。
此解决方案简洁,但创建了一个临时“标准”数组。@Vulkanino:您可以在一行中写入它,但如果没有扩展方法,您必须使用toArray隐式创建一个数组,或者在循环中填充列表。因此,它总是昂贵的,可能不会重复使用。
Dim arrayOfMyType() As MyType = DirectCast(al.ToArray(GetType(MyType)), MyType())
Dim strongTypeList As New List(Of MyType)(arrayOfMyType)
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