【问题标题】:What is the best way to iterate through an array in Classic Asp VBScript?在 Classic Asp VBScript 中遍历数组的最佳方法是什么?
【发布时间】:2010-09-05 08:46:23
【问题描述】:

在下面的代码中

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

使用LBound 提问有什么意义?当然,它总是 0。

【问题讨论】:

    标签: arrays asp-classic vbscript


    【解决方案1】:

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

    Dim x, y, z
    x = Array(1, 2, 3)
    
    For Each y In x
        z = DoSomethingWith(y)
    Next
    

    【讨论】:

    • 您不能使用For Each 直接编辑数组单元格,因为您的示例中的y 是数组单元格的副本,而不是引用。对于数组编辑,For i = LBound(arr) To UBound(arr) 将允许使用arr(i) 直接引用单元格并编辑单元格内容(如arr(i) = Trim(arr(i)))。
    【解决方案2】:

    有充分的理由不使用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) 来消除潜在的错误来源,因为这样就可以清楚地知道是否使用了arr(0)

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

    这有两个问题。

    1. 当我们尝试为数组元素赋值时,它不会反映在原始元素上。此代码将值 47 分配给变量 i,但不影响 arr 的元素。

      arr = 数组(3,4,8)
      对于 arr 中的每个 i
           我 = 47
      接下来我
      Response.Write arr(0) '- 返回 3,而不是 47
    2. 我们不知道for each 中数组元素的索引,也无法保证元素的顺序(虽然看起来是有序的)。

    【讨论】:

    • 为什么 VB6 程序员会假设数组是从一开始的?从零开始是 VB6 中数组的默认设置,除非在 Option Base 语句中另行指定或在声明数组时显式定义下边界。我更喜欢使用LBound,因为它可能并不总是 0(尽管正如 AnthonyWJones 所指出的,在 VBS 中它几乎总是如此)。但我认为拥有一个从零开始的数组而不使用分配的arr(0) 是不好的做法(因此我们不应该假设有人这样做)。不过,我确实同意反对使用 For Each 的论点。
    【解决方案3】:

    LBound 可能并不总是 0。

    虽然在 VBScript 中无法创建除 0 下限以外的任何值的数组,但仍然可以从可能指定了不同 LBound 的 COM 组件中检索变体数组。

    也就是说我从来没有遇到过这样的人。

    【讨论】:

      【解决方案4】:

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

      Option Base 1
      

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

      Dim myArray(4 To 42) As String
      

      【讨论】:

        【解决方案5】:

        我一直使用 For Each 循环。

        【讨论】:

          【解决方案6】:

          这是我的方法:

          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
          

          希望对你有帮助。

          【讨论】:

            猜你喜欢
            • 2021-03-28
            • 2012-07-16
            • 2011-04-24
            • 2021-09-20
            • 1970-01-01
            • 1970-01-01
            • 2015-12-31
            • 2012-05-16
            • 2021-07-16
            相关资源
            最近更新 更多