我只是想找一些有点问题的想法。我有一个字符串,它是消息的模板,例如:
Dear [[Guest.FirstName]],
We hope your are looking forward to your holiday in [[Booking.ResortName]]
我当前用于替换spaceholder标记的系统(例如[[Guest.FirstName]])是非常低效的,循环内部存在循环并且需要太长时间。
我正在寻找的是一种通过字符串的方式,直到找到[[something]],然后用它的真实值替换[[something]],然后继续通过字符串。
请注意替换[[something]]然后我需要访问空间持有者(即我需要知道它是[[Guest.FirstName]]还是[[Booking.ResortName]])。
任何有效实现这一目标的建议都会非常受欢迎,我觉得它应该相当简单,但我能想到的一切最终都会在循环中循环。
谢谢!
菲尔。
答案 0 :(得分:1)
有很多因素会影响表现,所以很难说,如果不了解所有细节,哪种方法最有效。但是,在编码简单性方面,使用RegEx MatchEvaluator
将是一个很好的选择。我相信你会同意它比你现在使用的更清洁:
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
如果您真的想要最有效的解决方案,那么逐个字符地追加,随意添加到StringBuilder
或输出Stream
,这将是您的最佳选择。它不会很漂亮,但是如果你发布你所拥有的CodeReview,可能会有一些人能找到让它稍微不那么丑陋的方法:)