2

我只是在寻找一些有小问题的想法。我有一个作为消息模板的字符串,例如:

Dear [[Guest.FirstName]],

We hope your are looking forward to your holiday in [[Booking.ResortName]]

我当前用于替换占位符令牌(例如 [[Guest.FirstName]])的系统效率非常低,循环内部有循环,并且花费的时间太长。

我正在寻找的是一种遍历字符串直到找到 [[something]] 的方法,然后将 [[something]] 替换为它的实际值,然后继续遍历字符串。

请注意替换 [[something]] 然后我需要访问空间持有者(即我需要知道它是 [[Guest.FirstName]] 还是 [[Booking.ResortName]])。

非常感谢任何有关实现这一目标的有效方法的建议,我觉得它应该相当简单,但我能想到的一切都以循环内的循环再次结束。

谢谢!

菲尔。

4

1 回答 1

1

有很多因素会影响性能,所以在不了解所有细节的情况下很难说哪种方法最有效。然而,当谈到编码的简单性时,使用RegExMatchEvaluator将是一个很好的选择。我相信你会同意它比你目前使用的任何东西都要干净:

Public Function ReplacePlaceholders(data As String) As String
    Dim r As New Regex("\[\[(?<placeholder>.*?)\]\]")
    data = r.Replace(data, New MatchEvaluator(AddressOf PlaceHolderReplacementEvaluator))
End Function

Private Function PlaceHolderReplacementEvaluator(match As Match) As String
    Dim name As String = match.Groups("placeholder").Value
    Return LookUpValueByPlaceholderName(name)   ' Replace with value lookup logic here
End Function

如果数据中占位符的总数将相当少,并且可能的占位符列表很小,那么最好只列出它们的值并像这样替换它们:

Public Function ReplacePlaceholders(data As String) As String
    Dim placeHolders As Dictionary(Of String, String) = LoadPlaceHolders()
    For Each i As KeyValuePair(Of String, String) In placeHolders
        data = data.Replace(i.Key, i.Value)
    Next
    Return data
End Function

Private Function LoadPlaceHolders() As Dictionary(Of String, String)
    Dim placeholders As New Dictionary(Of String, String)
    ' Load data here
    Return placeholders
End Function

但是,如果您真的想要最有效的解决方案,那么逐个字符并在执行过程中附加到 aStringBuilder或 outputStream将是您的最佳选择。它不会很漂亮,但是如果您将所拥有的内容发布到CodeReview,可能会有一些人可以找到使它变得不那么难看的方法:)

于 2013-08-19T18:35:43.827 回答