VB.NET ArrayList 到 List(Of T) 类型的复制/转换

Posted

技术标签:

【中文标题】VB.NET ArrayList 到 List(Of T) 类型的复制/转换【英文标题】:VB.NET ArrayList to List(Of T) typed copy/conversion 【发布时间】:2011-04-03 03:04:15 【问题描述】:

我有一个返回旧式 ArrayList 的第 3 方方法,我想将其转换为类型化的 ArrayList(Of MyType)。

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

【问题讨论】:

虽然您可能会发现更漂亮的代码,但您将始终确切地知道这段代码在做什么。无论如何,这可能是 CLR 在下面做的事情。 @Bill 我认为 CLR 可以优化,也许使用我无法访问的内部变量。 【参考方案1】:
Dim StronglyTypedList = OriginalArrayList.Cast(Of MyType)().ToList()
' requires `Imports System.Linq`

【讨论】:

演员不是 ArrayList 的成员 @vulkanino:是的,它是一种扩展方法。正如我所说,它需要 System.Linq 命名空间包含在当前编译单元中。 抱歉,我没有看到“要求”部分。无论如何,我不想只为那个演员包括 Linq。 :) @vul 除非您首先没有引用 System.Core 程序集,否则不“包含”Linq 不太可能是合理的。它只是一堆 C# 功能的名称。这是一个简单的 C# 方法,开销不大。您也可以直接使用System.Linq.Enumerable.ToList(System.Linq.Enumerable.Cast(Of MyType)(OriginalArrayList)) 调用该方法【参考方案2】:

重复。 看看这个 SO-Thread:In .Net, how do you convert an ArrayList to a strongly typed generic list without using a foreach?

在带有框架

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

【讨论】:

这个解决方案很简洁,但会创建一个临时的“标准”数组。 @Vulkanino:您可以在一行中编写它,但如果没有扩展方法,您必须使用 toArray 隐式创建一个数组或在循环中填充列表。因此它总是很昂贵,不能重复使用。【参考方案3】:

这个怎么样?

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 对象。

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于VB.NET ArrayList 到 List(Of T) 类型的复制/转换的主要内容,如果未能解决你的问题,请参考以下文章

util之ArrayList

VB.NET实现泛型List<T>排序的方法

List 的主要实现类:ArrayList

为啥不在 VB.NET 的 web 服务的参数中暴露 List(Of String)? [复制]

VB.NET List(of X).Contains 行为

vb .net里的 查找替换功能里 ,我想把List 替换替换成fList List是单独的字符串。