现在我将.Add()
改成List<string>
,但这会变得很长。
正如您在此处看到的那样,它在最终投入使用之前将33554432个字符串添加到列表中。
在这里我可以做些什么更好的解决方法?
由于使用了StringBuilder.AppendLine()
,所以效果更好。从那以后我再也没有遇到这个问题,但这当然并不意味着它不会发生。
很多人都在问为什么我要尝试组合字符串,并告诉我只读取诸如此类的内容。这并不是真正的选择,我正在从IMAP流中读取内容,因此无法对其进行分块处理,因为要读取它以搜索数据并向用户显示。
我可以可靠地分块的唯一方法是,如果我要创建一个新的StringBuilder
on-exception并开始对其进行编译,那么一旦读完,将所有已创建的StringBuilders合并为1个字符串,可能不会甚至都不行。
请注意,这也用于其他类型的操作,我知道返回位也不是很漂亮,也没有针对这种情况进行优化。
public static string ReadLine(this Stream stream, ref int bodySize, Encoding encoding, bool returnAsByteString=false) {
bool bodySizeWasSpecified = bodySize > 0;
byte b = 0;
List<byte> bytes = new List<byte>();
while (true) {
#region Try Get 1 Byte from Stream
try {
int i = stream.ReadByte();
if (i == -1) {
break;//stream ended/closed
}
b = (byte)i;
} catch (IOException) {
return null;//timeout
}
#endregion
#region If there's a body size specified, decrement back 1
if (bodySizeWasSpecified) {
bodySize--;
}
#endregion
#region If Byte is \n or \r
if (b == 10 || b == 13) {
#region If ByteArray is Empty and the byte is \n reloop so we dont start with a leading \n
if (bytes.Count == 0 && b == 10) {
continue;
}
#endregion
#region We hit a newline, lets finish the reads here.
break;
#endregion
}
#endregion
#region Add the read byte to the Byte Array
bytes.Add(b);
#endregion
#region Break if bodysize was greater than 0 but now its 0
if (bodySizeWasSpecified && bodySize == 0) {
break;
}
#endregion
}
if (returnAsByteString) {
return string.Join(string.Empty, bytes.ToArray().Select(x => x.ToString("X2")));
}
return encoding.GetString(bytes.ToArray());
}
答案 0 :(得分:1)
另一种选择是,您可以使用StringBuilder
类并使用Append()
或AppendLine
函数向其中添加字符串。这将创建一个包含所有字符串的长字符串。