gpt4 book ai didi

vb.net - VB.NET中字符串中的字符替换

转载 作者:行者123 更新时间:2023-12-04 16:02:17 30 4
gpt4 key购买 nike

我可以多快替换字符串中的字符?

所以这个问题的背景是这样的:我们有几个应用程序通过套接字相互通信并与客户端的应用程序通信。这些套接字消息包含不可打印的字符(例如 chr(0)),需要用预定的字符串(例如“{Nul}”} 替换,因为套接字消息保存在日志文件中。附带说明,不是每条日志消息都需要替换字符。

现在我开始阅读 this MSDN link 的小冒险。这是我从本网站的不同帖子中找到的。

我们使用的当前方法......在一天开始时......使用StringBuilder来检查所有可能的替换,例如......

    Public Function ReplaceSB(ByVal p_Message As String) As String
Dim sb As New System.Text.StringBuilder(p_Message)

sb.Replace(Chr(0), "{NUL}")
sb.Replace(Chr(1), "{SOH}")

Return sb.ToString
End Function

现在,正如博客文章指出的那样,将 StringBuilder 排除在外并使用 string.replace 确实会产生更快的结果。 (实际上,使用 StringBuilder 是整天执行此操作的最慢方法。)
    p_Message = p_Message.Replace(Chr(0), "{NUL}")
p_Message = p_Message.Replace(Chr(1), "{SOH}")

知道不是每条消息都需要经过这个过程,我认为不必处理那些可能被遗漏的消息会节省时间。所以使用正则表达式我首先搜索字符串,然后确定是否需要处理它。这与使用 string.replace 大致相同,基本上节省了不处理所有字符串的时间,但浪费了使用正则表达式检查所有字符串的时间。

然后建议尝试使用一些将其索引与新旧索引匹配的数组,并使用它来处理消息。所以它会是这样的......
Private chrArray() As Char = {Chr(0), Chr(1)}
Private strArray() As String = {"{NUL}", "{SOH}"}

Public Function TestReplace(ByVal p_Message As String) As String
Dim i As Integer

For i = 0 To ((chrArray.Length) - 1)
If p_Message.Contains(chrArray(i).ToString) Then
p_Message = p_Message.Replace(chrArray(i), strArray(i))
End If
Next

Return p_Message
End Function

到目前为止,这是我发现的处理这些消息的最快方法。我尝试了各种其他方法来解决这个问题,例如将传入的字符串转换为字符数组并进行比较,还尝试遍历字符串而不是 chrArray。

所以我对所有人的问题是:我可以让它更快吗?我错过了什么?

最佳答案

您可以通过减少一些查找来提高速度。以这个为例:

    If p_Message.Contains(chrArray(i).ToString) Then
.Contains方法是 O(n)。在最坏的情况下,您将遍历整个字符串中的所有字符而没有找到任何内容,因此您希望为数组中的每个字符至少遍历一次,因此它的 O(nm) 其中 n 是长度您的字符串和 m 是您要替换的字符数。

执行以下操作可能会获得更好的性能(我的 VB-fu 已生锈,尚未经过测试;)):
Private Function WriteToCharList(s as String, dest as List(Of Char))
for each c as Char in s
dest.Add(c)
Next
End Function

Public Function TestReplace(ByVal p_Message As String) As String
Dim chars as new List(Of Char)(p_Message.Length)

For each c as Char in p_Message
Select Case c
Case Chr(0): WriteToCharList("{NUL}", chars)
Case Chr(1): WriteToCharList("{SOH}", chars)
Case Else: chars.Add(c);
End Select
Next

Return New String(chars)
End Function

这将遍历 p_Message 中的字符最多两次(一次用于遍历,一次用于字符串构造函数复制 char 数组),使该函数为 O(n)。

关于vb.net - VB.NET中字符串中的字符替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4319191/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com