Проблема: поиск более эффективного способа нахождения точного значения соответствия в массиве 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
Если ваш массив может иметь дубликаты, то вы можете быть вплоть до последнего варианта перекручивания через массив. На самом деле это не слишком громоздко, если вы обернете его функцией. Я предполагаю, что лучший подход будет зависеть от таких вещей, как размер проверяемого массива и сколько поисковых запросов вам нужно сделать. Если вам нужна быстрая скорость поиска, вы можете загрузить свой массив в словарь и учесть дубликаты, сохранив массив индексов как «значение». –
Эй, @TimWilliams жаль, что я не прояснил ситуацию - все, что я тестирую, является логическим; существует ли значение в массиве. В частности, существует ли более эффективный метод, чем полагаться на «Excel.Application.Match» для этого, например, в Word или PowerPoint и т. Д.? –
Если массив равен 1 размеру (или обрабатывается до 1d), вы можете «Присоединить» массив к строке и использовать «Instr» для проверки соответствия совпадения. Он должен быть быстрым, но не проверен, если быстрее, чем Match. – user3357963