Как лучше всего перебирать массив в Classic Asp VBScript?

В коде ниже

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

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

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
39
0
71 625
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Наверное, от VB6. Поскольку с помощью оператора Вариант База в VB6 вы можете изменить нижнюю границу массивов следующим образом:

Option Base 1

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

Dim myArray(4 To 42) As String
Ответ принят как подходящий

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

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))).

Michał Sacharewicz 29.05.2014 18:20

Я всегда использовал цикл For Each.

Есть веская причина НЕ ИСПОЛЬЗОВАТЬ For i = LBound(arr) To UBound(arr)

dim arr(10) выделяет одиннадцать элементов массива от 0 до 10 (при условии, что VB6 по умолчанию Option Base).

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

Почему программисты VB6 предполагают, что массив основан на единице? Отсчет от нуля является значением по умолчанию для массивов в VB6, если иное не указано в инструкции Option Base или путем явного определения нижней границы при объявлении массива. Я предпочитаю использовать LBound из-за того, что он не всегда может быть равен 0 (хотя, как заметил AnthonyWJones, в VBS это почти всегда будет). Но я бы сказал, что это плохая практика - иметь массив с нулевым отсчетом и не использовать выделенный arr(0) (и, следовательно, мы не должны предполагать, что кто-то это сделал). Однако я согласен с аргументами против использования For Each.

dwillis77 01.01.2021 02:14

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

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

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

Это мой подход:

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

Надеюсь, это поможет.

Другие вопросы по теме