Aeo*_*058 8 c# stringbuilder replace
我已经将一个流下载为一个大约36MB的byte []'raw'.然后我将其转换为字符串
string temp = System.Text.Encoding.UTF8.GetString(raw)
Run Code Online (Sandbox Code Playgroud)
然后我需要用"\ r \n"替换所有"\n",所以我尝试了
string temp2 = temp.Replace("\n","\r\n")
Run Code Online (Sandbox Code Playgroud)
但它抛出了"内存不足"的例外.然后我尝试使用StringBuilder创建一个新字符串:
string temp2 = new StringBuilder(temp).Replace("\n","\r\n").toString()
Run Code Online (Sandbox Code Playgroud)
并没有抛出异常.为什么首先会出现内存问题(我这里只处理36MB),还有为什么StringBuilder.Replace()在另一个没有的情况下工作?
当你使用:
string temp2 = temp.Replace("\n","\r\n")
Run Code Online (Sandbox Code Playgroud)
对于字符串temp中"\n"的每个匹配,系统会使用替换创建一个新字符串.
使用StringBuilder时不会发生这种情况,因为StringBuilder是可变的,因此您实际上可以修改同一个对象而无需创建另一个对象.
例:
temp = "test1\ntest2\ntest3\n"
Run Code Online (Sandbox Code Playgroud)
使用第一种方法(字符串)
string temp2 = temp.Replace("\n","\r\n")
Run Code Online (Sandbox Code Playgroud)
相当于
string aux1 = "test1\r\ntest2\ntest3\n"
string aux2 = "test1\r\ntest2\r\ntest3\n"
string temp2 = "test1\r\ntest2\r\ntest3\r\n"
Run Code Online (Sandbox Code Playgroud)
使用Secon方法(StringBuilder)
string temp2 = new StringBuilder(temp).Replace("\n","\r\n").toString()
Run Code Online (Sandbox Code Playgroud)
相当于
Stringbuilder aux = "test1\ntest2\ntest3\n"
aux = "test1\r\ntest2\ntest3\n"
aux = "test1\r\ntest2\r\ntest3\n"
aux = "test1\r\ntest2\r\ntest3\r\n"
string temp2 = aux.toString()
Run Code Online (Sandbox Code Playgroud)