[英]Insert a carriage return every 64 characters of a string
我有一個像這樣的Base64編碼的字符串:
SWwgw6l0YWl0IHVuIHBldGl0IG5hdmlyZS [...] 0IG5hdmlyZSA=
輸入的String可以很大(> 1MB)。 並且出於互操作性的原因,我需要在每64個字符的大字符串中添加回車符。
我的第一個猜測是使用stringbuilder並像這樣每64個字符使用方法“ AppendLine”:
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();
但是我擔心那部分代碼的性能。 是否有更好的方法在某個位置的某個字符串中插入字符而無需重新構建另一個字符串?
有沒有更好的方法可以在不重新構建另一個字符串的情況下在某個位置的字符串中插入字符?
.NET字符串是不可變的,這意味着一旦創建它們就無法對其進行修改。
因此,如果你想字符插入到一個字符串,有沒有其他辦法,只能創建一個新的。 而且, StringBuilder
可能是解決此問題的最有效方法,因為它允許您執行所需的任意多個字符串構建步驟,最后只創建一個新字符串。
除非您實際上在實際場景中注意到性能問題,否則請保留當前的解決方案。 至少從性能的角度來看,這對我來說很好。
需要考慮的其他一些要點:
如果您仍然對解決方案不滿意,那么我可以考慮的一些小事情可能會使您當前的解決方案更有效:
預先聲明StringBuilder
所需的容量,這樣就不必調整其后備字符緩沖區的大小:
var additionalCharactersCount = Environment.NewLine.Length * (input.Length / 64); var sb = new StringBuilder(capacity: input.Length + additionalCharactersCount);
首先將完整的輸入字符串插入StringBuilder
,然后每64個字符重復.Insert(…, Environment.NewLine)
。
我不能完全肯定這是否會真正提高執行速度,但它會擺脫重復的字符串創建造成的.Substring
。 自己測量它是否比解決方案快。
您的代碼並非效率低下,嘗試節省100ms或更短的時間通常不值得。 但是如果您擔心的話,這是另一種更有效的方法,每64個字符插入一個新行(有時是\\ r \\ n,而不僅僅是\\ n)
string Output_With_CRLF = InputB64_Without_CRLF;
//Start at last index so that our new line inserts do not move the text, making sure to input every 64th of the original string
//This looks stupid to divide and multiply again, but it works because it is integer division
StringBuilder sb = new StringBuilder(InputB64_Without_CRLF);
for (int i = (InputB64_Without_CRLF.Length / 64) * 64; i >= 64; i -= 64)
sb.Insert(i, Environment.NewLine);
這將僅比原始代碼高一點點的效率,您可能不會注意到太大的差異。
與stakx交談后,我有了這個主意。 通過使用StringBuilder,您不會一遍又一遍地創建許多字符串。 StringBuilder非常高效,可以在不創建更多對象的情況下處理其插入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.