我有一个Base64编码的字符串,如下所示:
SWwgw6l0YWl0IHVuIHBldGl0IG5hdmlyZS [...] 0IG5hdmlyZSA=
Run Code Online (Sandbox Code Playgroud)
输入String可以大(> 1MB).出于互操作性的原因,我需要每隔64个字符将回车符添加到该大字符串中.
我的第一个猜测是使用stringbuilder并使用方法"AppendLine"每64个字符,如下所示:
string InputB64_Without_CRLF = "SWwgw6l0YWl0IHVuIHBldGl0IG5hdmlyZS [...] 0IG5hdmlyZSA=";
int BufferSize = 64;
int Index = 0;
StringBuilder sb = new StringBuilder();
while (Index < strInput.Length) {
sb.AppendLine(InputB64_Without_CRLF.Substring(Index, BufferSize));
Index += BufferSize;
}
string Output_With_CRLF = sb.ToString();
Run Code Online (Sandbox Code Playgroud)
但我担心这部分代码的性能.有没有更好的方法将字符插入某个位置的字符串而不重建另一个字符串?
有没有更好的方法将字符插入某个位置的字符串而不重建另一个字符串?
.NET字符串是不可变的,这意味着它们一旦创建就无法修改.
因此,如果你想字符插入到一个字符串,没有别的办法,但创建一个新的.并且StringBuilder很可能是最有效的方法,因为它允许您根据需要执行尽可能多的字符串构建步骤,并且最终只创建一个新的字符串.
除非您真实地注意到实际场景中的性能问题,否则请保留当前的解决方案.它对我来说很好,至少从性能的角度来看.
还需要考虑一些其他细节:
如果您对解决方案仍然不满意,我只能想到一些可能使您当前的解决方案更有效的小事:
预先声明StringBuilder所需的容量,以便不必调整其后备字符缓冲区的大小:
var additionalCharactersCount = Environment.NewLine.Length * (input.Length / 64);
var sb = new StringBuilder(capacity: input.Length + additionalCharactersCount);
Run Code Online (Sandbox Code Playgroud)将完整的输入字符串插入第StringBuilder一个,然后.Insert(…, Environment.NewLine)每64个字符重复一次.
我完全不确定这是否会提高执行速度,但它会消除由此引起的重复字符串创建.Substring.自己衡量一下它是否比你的解决方案更快.