一次性将数组添加到 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()
方法。
背景:
我正在尝试从任何给定的值数组填充一个 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()
方法。