亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

匹配字符串數組中的值

匹配字符串數組中的值

慕工程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 關注
  • 582 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號