【发布时间】:2013-01-02 23:02:37
【问题描述】:
我有一个数组说:VMHArray = (12,22,34,4) 现在有另一个 Arraylist 对象说 ArrayListTaskDetails 将数据保存为 (12,55,44,4,12,22, 21,107,43,22,34) 现在我编写了以下代码,用于从 ArrayListTaskDetails 列表中删除 VMHArray 中不存在的项目。
代码
Dim Flag : Flag = true
Dim Counter
For IndexSearch = 0 To ArrayListTaskDetails.Count - 1 step 4
Counter = 0
Do while Flag
If VMHArray(Counter) <> ArrayListTaskDetails (IndexSearch) Then
ArrayListTaskDetails.RemoveRange IndexSearch, 4
Flag = False
End If
Counter = Counter + 1
Loop
Next
现在假设在IndexSearch = 0 找到一个匹配项,因此它将删除位置0,1,2,3 处的元素 - 非常好。但由于删除和使ArrayList 对象通过功能连续,其他元素将由4 向左移动。现在的问题是For Loop 已经增加了 4,所以它将从location 4 的下一次迭代开始。因此,现在数组列表中0 location 处的新元素永远无法测试与VMHArray 数组元素的相等性。我们可以在不丢失预期操作的情况下处理这种情况吗?或者无论如何我们可以将For Loop 计数器设置为其直接位置,在该位置找到最近的匹配项并删除了 4 个元素。
如果有任何问题理解问题,请告诉我!
编辑 Go to 不起作用
代码(根据@Ankit 的建议)
Option Explicit
Dim Flag : Flag = true
Dim Counter
Dim VMHArray : VMHArray = Array(12,22,34,4)
Dim ArrayListTaskDetails : Set ArrayListTaskDetails = CreateObject("System.Collections.ArrayList")
ArrayListTaskDetails.Add(45)
ArrayListTaskDetails.Add(4)
ArrayListTaskDetails.Add(22)
ArrayListTaskDetails.Add(4)
ArrayListTaskDetails.Add(45)
ArrayListTaskDetails.Add(20)
ArrayListTaskDetails.Add(12)
ArrayListTaskDetails.Add(35)
ArrayListTaskDetails.Add(34)
Restart:
For IndexSearch = 0 To ArrayListTaskDetails.Count - 1 step 4
Counter = 0
Do while Flag
If VMHArray(Counter) <> ArrayListTaskDetails (IndexSearch) Then
ArrayListTaskDetails.RemoveRange IndexSearch, 4
Goto Restart
Flag = False
End If
Counter = Counter + 1
Loop
Next
MsgBox(Join(ArrayListTaskDetails.ToArray()),"$")
谢谢,
【问题讨论】:
-
你试过
exit for写for还是试试this to exit while loop -
@bonCodigo 如果我使用了
exit for,那么如何检查其余元素? -
只需将循环从最后一个元素迭代到第一个元素,例如
For IndexSearch = ArrayListTaskDetails.Count - 1 To 0 step -4。这也将避免对已检查的元素进行不必要的循环。 -
@AutomatedChaos - 向后循环是正确的,但你的起始位置是错误的(应该是 .Count - 4)
-
@CodeLover 您的 Join 语句的括号放置不正确,让
,"$"属于 MsgBox(Join 的第二个参数是可选的,这就是为什么您不会收到错误该声明)。如果要使用括号,则 MsgBox 需要为called,否则请去掉它们。现在,VBScript 引擎将"$"视为消息框的第二个(可选)参数,并向您发出警告。