1

我正在用头撞墙。首先,我无法将正确的 ArrayLists 添加到 ArrayList;它不断在迭代中添加最后一个 ArrayList 并覆盖前一个。

这就是它应该的样子:

ArrayList testCaseList:ArrayList 包含多个 tTestCase ArrayLists ArrayList tTestCase:ArrayList 包含多个 tempArray 数组 Array tempArray:数组包含两个字符串条目(从 Excel 文件中读取)

以下是相关代码:

'The ArrayList with ArrayLists (test cases):
Dim testCaseList : Set testCaseList = CreateObject("System.Collections.ArrayList")
'Temporary ArrayList containing test cases:
Dim tTestCase : Set tTestCase = CreateObject("System.Collections.Arraylist")

Set my_sheet = ExcelObject.sheets.item(testCaseSheet)

'Function that reads the test cases from the Excel file:
Function getTestsCaseActions (row, col)
    Do While my_sheet.cells(row, 2).Value <> ""
        'The first array to add to tTestCase:
        tempArray = array(my_sheet.cells(row, 2), my_sheet.cells(row, 3))
        tTestCase.Add tempArray

        'Go through the rows and columns and get the rest of the arrays to add:
        Do While my_sheet.cells(row, col).Value <> ""
            tTestCase.Add array(my_sheet.cells(row, col), my_sheet.cells(row+1, col))
            col = col+1
        Loop
        'We now have a tTestCase ArrayList complete with the test case arrays.

        'Test print the arrays in the tTestCase Arraylist:
        'Dim i
        'For i=0 To tTestCase.Count-1
        '    MsgBox tTestCase(i)(0) & " -> " & tTestCase(i)(1)  'Works fine.
        'Next

        'Add the tTestCase ArrayList to the testCastList ArrayList:
        testCaseList.Add tTestCase

        'Test:
        MsgBox testCaseList.count     'This LOOKS right - the count increases for each iteration
        Dim y
        For y=0 To testCaseList.Count-1
            MsgBox "Added to testCaseList: " & testCaseList(y)(0)(0)
        Next
        'But no. This is how the printout looks for each iteration:
        'Iteration 0: TC01
        'Iteration 1: TC02
        '             TC02
        'Iteration 2: TC03
                      TC03
        '             TC03

        tTestCase.Clear

        row = row+2
        col = 4
    Loop
End Function

getTestsCaseActions 3, 4

'MsgBox testCaseList.Count        'This shows 3, which appears correct...
'MsgBoc testCaseList(0).Count     'But this shows zero...? Should be 5...

正如我在代码注释中提到的,为每次迭代测试 tTestCase ArrayList 表明数据已正确读取并存储到其中。

但是当我将 tTestCase ArrayList 添加到 testCaseList ArrayList 时,它不起作用。在第一次迭代中,它添加了第一个 tTestCase 一次。到现在为止还挺好。然后在第二次迭代中,它添加了第二个 tTestCase 两次,显然覆盖了第一个。然后在第三次迭代中也是如此:它添加了第三次 tTestCase 三次,显然覆盖了现有的。

除此之外,如果我尝试在函数的外部访问 testCaseList - 甚至在函数中但在循环之外,计数显示 3(这是从 Excel 文件创建的 tTestCases 的数量),但它们的计数再次为 0 . 所以,除了空的arraylists之外什么都没有。这我不明白,因为 ArrayLists 是在函数之外启动的?

显然,这里有一些与在 ArrayLists 中写入和存储相关的内容我不明白。但我一直无法找到很多相关信息 - ArrayList 在 vbscript 中没有广泛使用吗?(也许因为它是一个 .NET 对象?)

4

2 回答 2

1

解决 ArrayLists 问题的一个可靠方法是忘记 ArrayLists 是被分配为引用的对象。将 alA 放入 alB,然后修改/清除 alA 将显示在 alB 中,因为 alB 包含对 alA 的引用(而非副本)。演示代码:

Option Explicit

Dim alA : Set alA = CreateObject("System.Collections.ArrayList")
alA.Add "one"
alA.Add "two"
Dim alB : Set alB = CreateObject("System.Collections.ArrayList")
alB.Add alA
alB.Add alA

Dim e
For Each e In alB
    WScript.Echo 0, e(0), e(1)
Next

WScript.Echo "----------"

WScript.Echo "alA(0)    = ""eins"""
alA(0)    = "eins"
WScript.Echo "alB(1)(1) = ""zwei"""
alB(1)(1) = "zwei"

For Each e In alB
    WScript.Echo 1, e(0), e(1)
Next
WScript.Echo 2, "alA(1)", alA(1)

WScript.Echo "----------"

alA.Clear
WScript.Echo "After alA.Clear"

For Each e In alB
    WScript.Echo 3, e.Count
Next

WScript.Echo "----------"

WScript.Echo "alA Is alB(0)", CStr(alA Is alB(0))
WScript.Echo "alA Is alB(1)", CStr(alA Is alB(1))

输出:

cscript 2-19941052.vbs
0 one two
0 one two
----------
alA(0)    = "eins"
alB(1)(1) = "zwei"
1 eins zwei
1 eins zwei
2 alA(1) zwei
----------
After alA.Clear
3 0
3 0
----------
alA Is alB(0) True
alA Is alB(1) True

更新 wrt 评论:

这很容易检查,使用

alB.Add alA.Clone()
alB.Add alA.Clone()

For Each e In alB
    WScript.Echo 3, e.Count, e(0), e(1)
Next

你会得到:

cscript 3-19941052.vbs
0 one two
0 one two
----------
alA(0)    = "eins"
alB(1)(1) = "zwei"
1 one two
1 one zwei
2 alA(1) two
----------
After alA.Clear
3 2 one two
3 2 one zwei
----------
alA Is alB(0) False
alA Is alB(1) False

您自己已经提到了警告:如果您的 Sub-ArrayLists 包含引用/对象,仍然会有龙。

于 2013-11-12T23:08:47.173 回答
0

正如评论中提到的,诀窍是使用 ArrayList 的 Clone() 函数。这将创建 ArrayList 的(浅)副本,可以将其插入到另一个 ArrayList 中,而不仅仅是创建引用。

testCaseList.Add tTestCase.Clone()
于 2013-11-13T11:53:14.427 回答