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) 类型的复制/转换的主要内容,如果未能解决你的问题,请参考以下文章