VBScript: Нахождение количества ненулевых элементов в массиве - PullRequest
2 голосов
/ 16 июля 2009

Каков «лучший» способ определения количества элементов в массиве в VBScript?

UBound () сообщает вам, сколько слотов было выделено для массива, но не сколько их заполнено - в зависимости от ситуации, эти числа могут совпадать или не совпадать.

Ответы [ 3 ]

4 голосов
/ 16 июля 2009

Мне не известен не итеративный метод для этого, поэтому вот итерационный метод:

Function countEmptySlots(arr)
    Dim x, c
    c = 0
    For x = 0 To ubound(arr)
        If arr(x) = vbUndefined Then c = c + 1
    Next
    countEmptySlots = c
End Function

Как говорит Спенсер Рупорт, для начала, вероятно, лучше отслеживать себя.

4 голосов
/ 18 июля 2009

Во-первых, нет предопределенного идентификатора с именем vbUndefined, как, по-видимому, подразумевается в настоящее время принятым ответом. Этот код работает только тогда, когда в верхней части скрипта нет Option Explicit. Если вы еще не используете Option Explicit, тогда начните делать это, это избавит вас от всякого горя.

Значение, которое вы можете использовать вместо vbUndefined, равно Empty, например: -

If arr(x) = Empty Then ...

Empty является предопределенным идентификатором и является значением по умолчанию для переменной или элемента массива, которому еще не присвоено значение.

Однако есть Готча, на который стоит обратить внимание. Следующие операторы отображают true: -

MsgBox 0 = Empty
MsgBox "" = Empty
MsgBox CDate("30 Dec 1899") = True

Следовательно, если вы ожидаете, что какое-либо из этих значений будет допустимым определенным значением элемента массива, тогда сравнение с Empty не обрезает его.

Если вы действительно хотите быть уверены, что элемент действительно «неопределенный», то есть «пустой», используйте функцию IsEmpty: -

If IsEmpty(arr(x)) Then

IsEmpty вернет истину только в том случае, если параметр действительно корректен Empty.

Существует также другая проблема, Null - это возможное значение, которое может храниться в массиве или переменной. Однако: -

MsgBox Null = Empty

Ошибка во время выполнения, «недопустимое использование нуля» и: -

MsgBox IsEmpty(Null)

ложно. Поэтому вам нужно решить, означает ли Null неопределенное значение или является допустимым значением. Если Null также означает undefined, вам нужно, чтобы ваш оператор If выглядел так: -

 If IsEmpty(arr(x)) Or IsNull(arr(x)) Then ....

Вы можете отказаться от этого, если знаете, что Null никогда не будет назначено в массив.

2 голосов
/ 16 июля 2009

Нет ничего встроенного, чтобы сказать вам, какие элементы заполнены. Лучший способ - отслеживать это самостоятельно, используя переменную count при добавлении / удалении элементов из массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...