2013-01-31 112 views
0

我有一个全局DataSet,名为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号码

我想保留数据集,如果有可能,因为那里很多依赖于它。

任何建议表示赞赏!

回答

0

如果你常常调用这个函数,你可以存储的模式和重用他们,而不是从DB每次读取它们

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 

注:Return后,您不需要Exit FunctionReturn将从VB6中取代旧的Exit Function

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 
+0

是的,我以为我是要求太多:( – Ervin

0

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

相关问题