Каков наилучший способ перебора массива в классическом Asp VBScript?
-
08-06-2019 - |
Вопрос
В приведенном ниже коде
For i = LBound(arr) To UBound(arr)
Какой смысл спрашивать, используя LBound
?Конечно, это всегда равно 0.
Решение
Почему бы не использовать For Each
?Таким образом, вам не нужно беспокоиться о том, что LBound
и UBound
являются.
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)
выделяет одиннадцать элементов массива от 0 до 10 (при условии использования опции VB6 по умолчанию Base).
Многие программисты VB6 предполагают, что массив основан на одном элементе, и никогда не используют выделенный arr(0)
.Мы можем устранить потенциальный источник ошибок, используя For i = 1 To UBound(arr)
или For i = 0 To UBound(arr)
, потому что тогда ясно , является ли arr(0)
используется.
For each
создает копию каждого элемента массива, а не указатель.
В этом есть две проблемы.
Когда мы пытаемся присвоить значение элементу массива, это не отражается на оригинале.Этот код присваивает переменной значение 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
Мы не знаем индекс элемента массива в
for each
, и нам не гарантируется последовательность элементов (хотя кажется, что все в порядке).
LBound
не всегда может быть 0.
Хотя в VBScript невозможно создать массив, который имеет что-либо, кроме нижней границы 0, все же возможно получить массив вариантов из COM-компонента, который, возможно, указал другое значение LBound
.
Тем не менее, я никогда не сталкивался с человеком, который делал что-либо подобное.
Вероятно, это происходит из VB6.Потому что с База опций оператор в VB6, вы можете изменить нижнюю границу массивов следующим образом:
Option Base 1
Также в VB6 вы можете изменить нижнюю границу определенного массива следующим образом:
Dim myArray(4 To 42) As String
Я всегда использовал Для Каждого Из них...