在Classic Asp VBScript中迭代数组的最佳方法是什么?

在Classic Asp VBScript中迭代数组的最佳方法是什么?

What is the best way to iterate through an array in Classic Asp VBScript?

在下面的代码中

1
For i = LBound(arr) To UBound(arr)

问使用LBound有什么意义? 肯定总是0。


为什么不使用For Each?这样,您无需关心LBoundUBound是什么。

1
2
3
4
5
6
Dim x, y, z
x = Array(1, 2, 3)

For Each y In x
    z = DoSomethingWith(y)
Next

有充分的理由不使用For i = LBound(arr) To UBound(arr)

dim arr(10)分配数组的11个成员(0到10)(假设VB6默认选项库)。

许多VB6程序员认为数组是基于1的,并且从不使用分配的arr(0)。我们可以使用For i = 1 To UBound(arr)For i = 0 To UBound(arr)消除潜在的bug来源,因为很明显是否正在使用arr(0)

For Each复制每个数组元素,而不是指针。

这有两个问题。

  • 当我们尝试为数组元素分配值时,它不会影响原始值。该代码为变量i分配了47值,但不影响arr的元素。

    1
    2
    3
    4
    5
    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的变体数组。

    那就是说我从来没有遇到过做过这样的事情的人。


    可能来自VB6。因为使用VB6中的Option Base语句,您可以像这样更改数组的下限:

    1
    Option Base 1

    同样在VB6中,您可以像这样更改特定数组的下限:

    1
    Dim myArray(4 To 42) As String

    我一直都用For Each ...


    这是我的方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    dim arrFormaA(15)
    arrFormaA( 0 ) ="formaA_01.txt"
    arrFormaA( 1 ) ="formaA_02.txt"
    arrFormaA( 2 ) ="formaA_03.txt"
    arrFormaA( 3 ) ="formaA_04.txt"
    arrFormaA( 4 ) ="formaA_05.txt"
    arrFormaA( 5 ) ="formaA_06.txt"
    arrFormaA( 6 ) ="formaA_07.txt"
    arrFormaA( 7 ) ="formaA_08.txt"
    arrFormaA( 8 ) ="formaA_09.txt"
    arrFormaA( 9 ) ="formaA_10.txt"
    arrFormaA( 10 ) ="formaA_11.txt"
    arrFormaA( 11 ) ="formaA_12.txt"
    arrFormaA( 12 ) ="formaA_13.txt"
    arrFormaA( 13 ) ="formaA_14.txt"
    arrFormaA( 14 ) ="formaA_15.txt"

    Wscript.echo(UBound(arrFormaA))
    ''displays"15"

    For i = 0 To UBound(arrFormaA)-1
        Wscript.echo(arrFormaA(i))
    Next

    希望能帮助到你。


    推荐阅读