0

我有一个名为 ds_SortPlan 的全局数据集,用于将匹配某个正则表达式模式的字符串映射到整数。

Private Function MatchDestination(ByVal code As String) As Integer
    Dim m As Match
    For Each tempRow As Data.DataRow In ds_SortPlan.Tables("MatchCode_Lookup").Rows
        m = Regex.Match(code, tempRow.Item("Match_String"))
        If m.Success Then
            Return tempRow.Item("ID")
            Exit Function
        End If
    Next tempRow
    Return 0
End Function

这似乎是一种非常缓慢和笨拙的方式。:( 有没有更好的方法来设置一个正则表达式,它将接受一个字符串代码并尝试将它与返回关联 ID 号的多个模式匹配。

如果可能的话,我想保留 DataSet,因为它有很多依赖项。

任何建议表示赞赏!

4

3 回答 3

0

如果不重新考虑你的对象模型,你不能真正让这个方法更快,但你可以把它写得更短(在我看来更具可读性):

Private Function MatchDestination(ByVal code As String) As Integer
    For Each row In ds_SortPlan.Tables("MatchCode_Lookup").Rows
        If Regex.Match(code, row.Item("Match_String")).Success Then
            Return row.Item("ID")
        End If
    Next row
    Return 0
End Function
于 2013-01-31T19:41:41.863 回答
0

如果你经常调用这个函数,你可以存储模式并重用它们,而不是每次都从数据库中读取它们

Private Function MatchDestination(ByVal input As String) As Integer
    Static patterns As List(Of KeyValuePair(Of Integer, String))

    If patterns Is Nothing Then
        patterns = New List(Of KeyValuePair(Of Integer, String))
        For Each row As DataRow In ds_SortPlan.Tables("MatchCode_Lookup").Rows
            Dim entry = New KeyValuePair(Of Integer, String)( _
                DirectCast(row.Item("ID"), Integer), _
                DirectCast(row.Item("Match_String"), String) _
            )
            patterns.Add(entry)
        Next
    End If

    For Each pattern As KeyValuePair(Of Integer, String) In patterns
        If Regex.IsMatch(input, pattern.Value) Then
            Return pattern.Key
        End If
    Next
    Return 0
End Function

注意:你不需要Exit Functionafter Return。从 VB6Return替换旧的。Exit Function

于 2013-01-31T19:59:57.783 回答
0

您可以在那里添加缓存。为正则表达式创建一个静态数组并从那里使用旧的正则表达式对象,而不是每次都重新创建它们。如果您要经常使用它们,也不要忘记编译正则表达式。当您使用第二次或更长时间时,这将为您提供更多性能。所以缓存+编译正则表达式会给你性能提升;但它会使第一次运行变慢。只需在创建新的正则表达式时将 RegexOptions.Compiled 添加到参数中。

于 2013-01-31T20:02:34.753 回答