Используя InStr вместо оператора And In? - PullRequest
1 голос
/ 01 октября 2010

Вместо использования AND в длинном операторе If я использую InStr, чтобы сопоставить динамическое значение с известным списком.Вот так:

If InStr("John, George, Harry", personName) Then...

Это нормально?Должен ли я использовать AND вместо этого?Есть ли лучший способ?

Спасибо.

Ответы [ 5 ]

2 голосов
/ 01 октября 2010

Нет, это не хорошо. Если вы сделаете это таким образом, вы бы сопоставили кого-то с именами «n, Ge» и «Geor».

Мой VB немного ржавый, но вы можете сделать:

Dim namearray() As String = {"John", "George", "Harry"}
Dim name As String = "John"
For i = LBound(namearray) To UBound(namearray)
    If namearray(i) = personName Then
        ... i is the array index ...
    End If
Next i

Я не знаю, имеет ли VB6 Array.indexOf, но если это так, то вы также можете использовать подход, описанный здесь .

Если ваш список имен очень большой, вы можете использовать Словарь

1 голос
/ 01 октября 2010

А как насчет подстрок, таких как Anne-Marie и имя человека = Anne?

Вместо этого вы можете использовать оператор выбора регистра ...

Пример снят с DATABISON

Sub My_Select_Case_3_Text()
Dim my_val As String

my_val = "Pineapple"
Select Case my_val
Case "Apple": MsgBox "The fruit is Apple"
Case "Orange": MsgBox "The fruit is Orange"
Case "Pineapple": MsgBox "The fruit is Pineapple"
End Select
End Sub
0 голосов
/ 03 октября 2010

Я не думаю, что есть единый ответ на все случаи жизни.

Если список очень короткий и фиксированный, используйте серию тестов с Or:

If personName = "John" Or personName = "George" Or personName = "Harry" Then

A midсписок может быть представлен в виде строки, как уже предлагалось, с небольшой оптимизацией:

If InStr("$John$George$Harry$", "$" & personName & "$") Then 

Вы также можете использовать массив в качестве списка вместе с Filter ():

If UBound(Filter(Array("$John$", "$George$", "$Harry$"), _
                 "$" & personName & "$")) >= 0 Then

Эти параметры, вероятно, будут работать лучше, если у вас есть предварительно скомпонованные String или Array, а не встраивание их в выражение.

Для более длинного списка вы можете использовать объект Scripting.Dictionary для хранения тестовых случаев.Это включает хеш с разрешением коллизий и метод Exists ().VB6 Collection тоже работает, хотя для реализации функциональности, подобной Exists, нужно использовать исключение.

Еще лучше, если у вас есть несколько «полей» для проверки (имя и цвет глаз?), Вы можете использовать изготовленный набор записей ADOи его свойство Filter.Это позволяет легко определить, когда у вас Джордж с голубыми глазами или Гарри с карими глазами.Для более длинного списка кандидатов вы можете установить динамическое свойство «Оптимизировать» на «Истина» в полях набора записей, которые вы хотите хэшировать для повышения производительности.

0 голосов
/ 01 октября 2010

Пара опций

If Instr("[John][George][Harry]","[" & personname & "]") Then

предотвратит частичное совпадение.Если вы оказались в Excel vba, вы можете использовать встроенную функцию таблицы MATCH

Application.WorksheetFunction.Match("John",array("John","George","Harry"),false)
0 голосов
/ 01 октября 2010

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

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