组合长字符串的好方法是什么?

时间:2018-10-24 17:40:05

标签: c#

现在我将.Add()改成List<string>,但这会变得很长。

enter image description here

正如您在此处看到的那样,它在最终投入使用之前将33554432个字符串添加到列表中。

在这里我可以做些什么更好的解决方法?

StringBuilder

由于使用了StringBuilder.AppendLine(),所以效果更好。从那以后我再也没有遇到这个问题,但这当然并不意味着它不会发生。

我的最终目标

很多人都在问为什么我要尝试组合字符串,并告诉我只读取诸如此类的内容。这并不是真正的选择,我正在从IMAP流中读取内容,因此无法对其进行分块处理,因为要读取它以搜索数据并向用户显示。

我可以可靠地分块的唯一方法是,如果我要创建一个新的StringBuilder on-exception并开始对其进行编译,那么一旦读完,将所有已创建的StringBuilders合并为1个字符串,可能不会甚至都不行。

我正在使用扩展ReadLine方法读取流

请注意,这也用于其他类型的操作,我知道返回位也不是很漂亮,也没有针对这种情况进行优化。

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());
}

1 个答案:

答案 0 :(得分:1)

另一种选择是,您可以使用StringBuilder类并使用Append()AppendLine函数向其中添加字符串。这将创建一个包含所有字符串的长字符串。