Каков наилучший способ перебора массива в Classic Asp VBScript? - PullRequest
35 голосов
/ 05 августа 2008

В коде ниже

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

Какой смысл спрашивать, используя LBound? Конечно, это всегда 0.

Ответы [ 5 ]

50 голосов
/ 05 августа 2008

Почему бы не использовать For Each? Таким образом, вам не нужно заботиться о том, что такое LBound и UBound.

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

For Each y In x
    z = DoSomethingWith(y)
Next
17 голосов
/ 23 сентября 2008

Есть веская причина для НЕ ИСПОЛЬЗОВАТЬ 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 делает копию каждого элемента массива, а не указатель.

У этого есть две проблемы.

  1. Когда мы пытаемся присвоить значение элементу массива, оно не отражается на оригинале. Этот код присваивает значение 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
  2. Мы не знаем индекс элемента массива в for each, и нам не гарантируется последовательность элементов (хотя, кажется, это в порядке.)

3 голосов
/ 24 сентября 2008

LBound не всегда может быть 0.

Хотя невозможно создать массив, который имеет что-либо, кроме нижней границы 0 в VBScript, все еще возможно извлечь массив вариантов из COM-компонента, который мог бы указать другой LBound.

Тем не менее, я никогда не сталкивался с тем, кто сделал что-то подобное.

2 голосов
/ 05 августа 2008

Вероятно, это от VB6. Потому что с помощью оператора Option Base в VB6 вы можете изменить нижнюю границу массивов следующим образом:

Option Base 1

Также в VB6 вы можете изменить нижнюю границу определенного массива следующим образом:

Dim myArray(4 To 42) As String
1 голос
/ 12 августа 2008

Я всегда использовал для каждого ...

...