¿Cuál es la mejor manera de iterar a través de una matriz en Asp VBScript clásico?


En el siguiente código

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

¿Cuál es el punto de preguntar usando LBound? Seguramente eso es siempre 0.

Author: DhruvJoshi, 2008-08-05

5 answers

¿por Qué no usar For Each? De esa manera no necesitas preocuparte por lo que son LBound y UBound.

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

For Each y In x
    z = DoSomethingWith(y)
Next
 47
Author: Chris Farmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-15 17:16:53

Hay una buena razón para NO USAR For i = LBound(arr) To UBound(arr)

dim arr(10) asigna once miembros de la matriz, del 0 al 10 (asumiendo la Base de Opciones por defecto de VB6).

Muchos programadores VB6 asumen que el array está basado en uno, y nunca usan el asignado arr(0). Podemos eliminar una fuente potencial de errores usando For i = 1 To UBound(arr) o For i = 0 To UBound(arr), porque entonces está claro si se está utilizando arr(0).

For each hace una copia de cada elemento de matriz, en lugar de un puntero.

Esto tiene dos problema.

  1. Cuando tratamos de asignar un valor a un elemento array, no se refleja en original. Este código asigna un valor de 47 a la variable i, pero no afecta a los elementos de arr.

    arr = Array(3,4,8)
    for each i in arr
         i = 47
    next i
    Response.Write arr(0) '- returns 3, not 47
  2. No conocemos el índice de un elemento array en un for each, y no tenemos garantizada la secuencia de elementos (aunque parece estar en orden.)

 16
Author: xpda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-27 02:59:50

LBound puede que no siempre sea 0.

Aunque no es posible crear un array que tenga nada más que un límite inferior 0 en VBScript, todavía es posible recuperar un array de variantes de un componente COM que puede haber especificado un LBound diferente.

Dicho esto, nunca me he encontrado con uno que haya hecho algo así.

 3
Author: AnthonyWJones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-16 08:10:40

Probablemente proviene de VB6. Porque con la instrucción Option Base en VB6, puede alterar el límite inferior de los arrays de esta manera:

Option Base 1

También en VB6, puede alterar el límite inferior de un array específico como este:

Dim myArray(4 To 42) As String
 1
Author: huseyint,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-05 14:27:57

Siempre he usado Para Cada Uno...

 1
Author: James Marshall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-12 14:34:32