一次性将数组添加到 ArrayList

Add Array to ArrayList in one go

背景:

我正在尝试从任何给定的值数组填充一个 ArrayList 对象。

要填充这些对象,您可以使用 .Add 方法或 .AddRange 方法,但是无论哪种方式,您似乎都需要遍历数组以填充 ArrayList。显然,要使用 .AddRange 我们需要使用 Queue 对象。

代码:

.Add方法示例:

Sub Test1()

Dim ArrList As Object: Set ArrList = CreateObject("System.Collections.ArrayList")

With ArrList
    For Each ArrItem In Array("A", "B", "C")
        If Not .contains(ArrItem) Then .Add ArrItem
    Next
End With

End Sub

.AddRange 方法示例:

Sub Test2()

Dim ArrList As Object: Set ArrList = CreateObject("System.Collections.ArrayList")
Dim Q As Object: Set Q = CreateObject("System.Collections.Queue")

With Q
    For Each ArrItem In Array("A", "B", "C")
        If Not .contains(ArrItem) Then .Enqueue ArrItem
    Next
End With

ArrList.AddRange Q

End Sub

问题:

如你所见,如果我们不能直接给数组赋值,我想知道.AddRange方法的目的是什么。我们仍然需要迭代 .Enqueue 它们。

那么一次性给一个数组赋值有什么用呢?很明显,下面会报错(5)出来:

ArrList.AddRange Array("A", "B", "C")

顺便说一句,对于早期绑定,请添加 mscorlib.dll 参考。

问题是 ArrayList 是一个 .NET 对象,而 AddRange() 方法需要一个 ICollection 类型的参数。现在,VBA 数组不是 ICollection 对象(即,它没有实现 .NET 的 ICollection 接口),因此,对方法的调用失败。

Queue 对象起作用的原因是它确实实现了 ICollection。任何其他 ICollection 对象也可以。例如,如果您有另一个 ArrayList,您可以将其传递给 AddRange 方法,它会正常工作。试试这个,例如:

Sub Test()
    Dim ArrList1 As Object: Set ArrList1 = CreateObject("System.Collections.ArrayList")
    Dim ArrList2 As Object: Set ArrList2 = CreateObject("System.Collections.ArrayList")

    ArrList1.Add "A"
    ArrList1.Add "B"
    ArrList1.Add "C"

    ArrList2.AddRange ArrList1
End Sub

所以,底线是:我猜你运气不好使用 VBA 数组传递给 ArrayList.AddRange() 方法。