我有一个名为ds_SortPlan的全局DataSet,用于将匹配特定正则表达式模式的字符串映射到整数。
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,因为它有很多依赖项。
感谢任何建议!
答案 0 :(得分: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
答案 1 :(得分: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 Function
之后您不需要Return
。 Return
替换了VB6中的旧Exit Function
。
答案 2 :(得分:0)
您可以在那里添加缓存。为正则表达式创建一个静态数组,并从那里使用旧的正则表达式对象,而不是每次都重新创建它们。 如果要使用它们,也不要忘记编译正则表达式。这将在第二次或更长时间使用时为您提供更多性能。因此缓存+编译正则表达式将为您带来性能提升;但它会让它在首次运行时变慢。只需在创建新的正则表达式时向参数添加RegexOptions.Compiled。