0

特定の正規表現パターンに一致する文字列を整数にマップするために使用している 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

これは、非常に遅くて扱いにくい方法のように思えます。:( String コードを取得し、関連付けられた 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

この関数を頻繁に呼び出す場合は、毎回 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

Exit Function注: afterは必要ありませんReturn。古いものを VB6 からReturn置き換えます。Exit Function

于 2013-01-31T19:59:57.783 に答える