为了账号安全,请及时绑定邮箱和手机立即绑定

匹配字符串数组中的值

匹配字符串数组中的值

慕工程0101907 2019-11-18 18:32:24
问题:寻找一种更有效的方法来查找一维数组中是否存在完全匹配的值-本质上是一个布尔值true/false。我是否忽略了明显的东西?还是我可能应该使用集合对象或字典时,通过使用数组来简单地使用错误的数据结构?在后者中,我可以分别检查.Containsor .Exists方法在Excel中,我可以检查向量数组中的值,例如:If Not IsError(Application.Match(strSearch, varToSearch, False)) Then' Do stuffEnd 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 IfNext
查看完整描述

3 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

如果我们要谈论性能,那么没有替代品可以运行一些测试。以我的经验,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 - t


End Sub



Function Contains(arr, v) As Boolean

Dim 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 = rv

End Function

输出:


Contains       0.8710938 

Match          4.210938 


查看完整回答
反对 回复 2019-11-18
  • 3 回答
  • 0 关注
  • 532 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信