匹配字符串数组中的值

问题:寻找一种更有效的方法来查找一维数组中是否存在完全匹配的值-本质上是一个布尔值true/false。


我是否忽略了明显的东西?还是我可能应该使用集合对象或字典时,通过使用数组来简单地使用错误的数据结构?在后者中,我可以分别检查.Containsor .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


慕工程0101907
浏览 558回答 3
3回答

慕的地10843

如果我们要谈论性能,那么没有替代品可以运行一些测试。以我的经验,Application.Match()比调用使用循环的函数要慢十倍。Sub Tester()    Dim i As Long, b, t    Dim arr(1 To 100) As String    For i = 1 To 100        arr(i) = "Value_" & i    Next i    t = Timer    For i = 1 To 100000        b = Contains(arr, "Value_50")    Next i    Debug.Print "Contains", Timer - t    t = Timer    For i = 1 To 100000        b = Application.Match(arr, "Value_50", False)    Next i    Debug.Print "Match", Timer - tEnd SubFunction Contains(arr, v) As BooleanDim rv As Boolean, lb As Long, ub As Long, i As Long    lb = LBound(arr)    ub = UBound(arr)    For i = lb To ub        If arr(i) = v Then            rv = True            Exit For        End If    Next i    Contains = rvEnd Function输出:Contains       0.8710938 Match          4.210938 
打开App,查看更多内容
随时随地看视频慕课网APP