我需要在. net中将字符串分割为换行符,我所知道的分割字符串的唯一方法是使用split方法。然而,这将不允许我(容易)在换行上分裂,那么最好的方法是什么?


当前回答

尽量避免使用字符串。分割是一种通用的解决方案,因为在使用函数的任何地方都会使用更多的内存——原始字符串和分割副本,都在内存中。相信我,当你开始扩展时,这可能是一个非常严重的问题——运行一个32位的批处理应用程序处理100MB的文档,你会在8个并发线程时崩溃。并不是说我以前去过那里……

相反,使用这样的迭代器;

public static IEnumerable<string> SplitToLines(this string input)
{
    if (input == null)
    {
        yield break;
    }

    using (System.IO.StringReader reader = new System.IO.StringReader(input))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            yield return line;
        }
    }
}

这将允许你在你的数据周围做一个更有效的内存循环;

foreach(var line in document.SplitToLines()) 
{
    // one line at a time...
}

当然,如果你想把它都放在内存中,你可以这样做;

var allTheLines = document.SplitToLines().ToArray();

其他回答

string[] lines = text.Split(
  Environment.NewLine.ToCharArray(), 
  StringSplitOptions.RemoveEmptyStrings);

RemoveEmptyStrings选项将确保由于\n跟在\r后面而没有空条目

(编辑以反映注释:)注意,它也会丢弃文本中的真正空行。这通常是我想要的,但这可能不是你的要求。

要拆分一个字符串,你需要使用一个字符串数组的重载:

string[] lines = theText.Split(
    new string[] { Environment.NewLine },
    StringSplitOptions.None
);

编辑: 如果要处理文本中不同类型的换行符,可以使用匹配多个字符串的功能。这将正确地拆分任意类型的换行,并保留文本中的空行和空格:

string[] lines = theText.Split(
    new string[] { "\r\n", "\r", "\n" },
    StringSplitOptions.None
);
using System.IO;

string textToSplit;

if (textToSplit != null)
{
    List<string> lines = new List<string>();
    using (StringReader reader = new StringReader(textToSplit))
    {
        for (string line = reader.ReadLine(); line != null; line = reader.ReadLine())
        {
            lines.Add(line);
        }
    }
}

从。net 6开始,我们可以使用新的string . replacelineends()方法来规范化跨平台的行结束符,所以现在我发现这是最简单的方法:

var lines = input
  .ReplaceLineEndings()
  .Split(Environment.NewLine, StringSplitOptions.None);

尽量避免使用字符串。分割是一种通用的解决方案,因为在使用函数的任何地方都会使用更多的内存——原始字符串和分割副本,都在内存中。相信我,当你开始扩展时,这可能是一个非常严重的问题——运行一个32位的批处理应用程序处理100MB的文档,你会在8个并发线程时崩溃。并不是说我以前去过那里……

相反,使用这样的迭代器;

public static IEnumerable<string> SplitToLines(this string input)
{
    if (input == null)
    {
        yield break;
    }

    using (System.IO.StringReader reader = new System.IO.StringReader(input))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            yield return line;
        }
    }
}

这将允许你在你的数据周围做一个更有效的内存循环;

foreach(var line in document.SplitToLines()) 
{
    // one line at a time...
}

当然,如果你想把它都放在内存中,你可以这样做;

var allTheLines = document.SplitToLines().ToArray();