C#在四个相等的子串中拆分一个字符串,但仅限于换行符

时间:2014-08-31 20:08:20

标签: c# regex string memory split

我收到了一个内存不足的异常,下面的代码将一个大字符串(str变量)拆分成行并将它们排队:

 foreach (
            var value in
                str.Split(
                    new string[] { System.Environment.NewLine.ToString(CultureInfo.InvariantCulture) },
                       StringSplitOptions.None))
                {
                    lines.Enqueue(value);
                }

我的解决方案(我不确定它是一个好的解决方案)是首先将大字符串(str变量)拆分为4个块,然后分别拆分每个块,并将结果行排入行队列。我遇到的问题是弄清楚如何拆分换行符,这样我的最终行队列只包含完整的行。

我编写了以下代码将大字符串(str变量)拆分为4个子字符串但是如何将其更改为仅在换行符上拆分?

      int chunkNum = 4;
      int chunkLength = str.Length/chunkNum;
      int stringLength = str.Length;
      var j = 0;
          for (var i = 0; i < stringLength; i += chunkLength)
           {
              if (j == (chunkNum - 1))
              {
                  chunkLength = stringLength - i;
              }

              chunkQueue.Enqueue(str.Substring(i, chunkLength + i));
              j++;
            }

2 个答案:

答案 0 :(得分:1)

您可以使用提供StreamReader方法的ReadLine

string text = "Split\nby\nnewline", line = "";
using( StreamReader sr = new StreamReader( new MemoryStream( Encoding.UTF8.GetBytes( text ) ) ) ) {
    while( ( line = sr.ReadLine() ) != null )
        Console.WriteLine( line );
}

那套房能满足您的需求吗?只是将字符串排队而不是打印它。

答案 1 :(得分:0)

如果输入字符串很大,你可能从Stream(文件?)得到它。 也许您可以逐个字符地读取该流,附加到Stringbuilder,并在该字符是换行符时排队?

啊,只是错过了pikausp的答案,这更有意义......