在Classic Asp VBScript中迭代数组的最佳方式是什么?
问题描述:
答
为什么不使用For Each
?这样你就不需要关心LBound
和UBound
是什么。
Dim x, y, z
x = Array(1, 2, 3)
For Each y In x
z = DoSomethingWith(y)
Next
答
可能它来自VB6。因为在VB6 Option Base语句,可以改变下界阵列是这样的:
Option Base 1
而且在VB6中,你可以改变下界特定阵列的是这样的:
Dim myArray(4 To 42) As String
答
我一直用于各...
答
有一个很好的理由不要使用For i = LBound(arr) To UBound(arr)
dim arr(10)
分配阵列的十名一名成员,从0到10(假设VB6默认选项基础)。
许多VB6程序员都假设该数组是基于一个数组,并且从不使用分配的arr(0)
。我们可以通过使用For i = 1 To UBound(arr)
或For i = 0 To UBound(arr)
来消除潜在的错误来源,因为那么清楚是否正在使用arr(0)
。
For each
使每个数组元素的副本,而不是一个指针。
这有两个问题。
-
当我们试图给数组元素赋值时,它并不反映在原始数据上。此代码将值47分配给变量
i
,但不影响arr
的元素。arr = Array(3,4,8) for each i in arr i = 47 next i Response.Write arr(0) '- returns 3, not 47
我们不知道一个数组元素的索引中
for each
,我们不能保证元素的顺序(尽管它似乎是为了。)
答
LBound
可能并不总是0.
虽然无法创建一个数组,但VBScript中的下限不是0,但仍可以从COM组件中检索变体数组可能指定了不同的LBound
。
这就是说我从来没有遇到过这样的事情。
您不能使用For Each来直接编辑数组单元,因为在您的示例中`y`是数组单元的副本,而不是参考。对于数组编辑,`For i = LBound(arr)To UBound(arr)`将允许直接使用`arr(i)`引用单元格并编辑单元格内容(比如`arr(i)= Trim(arr ))`)。 – 2014-05-29 14:20:47