Проблема: поиск более эффективного способа нахождения точного совпадающего значения в массиве 1d - по существу булев true/false
.
Я пропущу что-то очевидное? Или я просто использую неправильную структуру данных, используя массив, когда я, вероятно, должен использовать объект коллекции или словарь? В последнем я мог проверить метод .Contains
или .Exists
, соответственно
В Excel я могу проверить значение в векторном массиве, например:
If Not IsError(Application.Match(strSearch, varToSearch, False)) Then
' Do stuff
End If
Это возвращает индекс точного соответствия, который, очевидно, подпадает под ограничения функции Match
, которая находит только первое совпадающее значение в этом контексте. Это обычно используемый метод, и тот, который я использовал в течение длительного времени, тоже.
Это достаточно удовлетворительно для Excel - но как насчет других приложений?
В других приложениях я могу сделать в основном одно и то же, но требует включения ссылки на библиотеку объектов Excel, а затем:
If Not IsError(Excel.Application.match(...))
Это кажется глупым, хотя и сложно управлять распределенными файлами из-за полномочий/центра доверия и т.д.
Я попытался использовать функцию Filter():
If Not Ubound(Filter(varToSearch, strSearch)) = -1 Then
'do stuff
End If
Но проблема с этим подходом заключается в том, что Filter
возвращает массив неполных совпадений, а не массив точных совпадений. (Я не знаю, почему было бы полезно возвращать подстроки/частичные совпадения.)
Другая альтернатива - буквально перебирать каждое значение в массиве (это также очень часто используется, я думаю) - что кажется еще более ненужным громоздким, чем вызов функции Excel Match
.
For each v in vArray
If v = strSearch Then
' do stuff
End If
Next