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


当前回答

这里的示例非常棒,帮助我解决了当前的“挑战”,以一种更可读的方式分割rsa密钥。基于Steve Coopers的解决方案:

    string Splitstring(string txt, int n = 120, string AddBefore = "", string AddAfterExtra = "")
    {
        //Spit each string into a n-line length list of strings
        var Lines = Enumerable.Range(0, txt.Length / n).Select(i => txt.Substring(i * n, n)).ToList();
        
        //Check if there are any characters left after split, if so add the rest
        if(txt.Length > ((txt.Length / n)*n) )
            Lines.Add(txt.Substring((txt.Length/n)*n));

        //Create return text, with extras
        string txtReturn = "";
        foreach (string Line in Lines)
            txtReturn += AddBefore + Line + AddAfterExtra +  Environment.NewLine;
        return txtReturn;
    }

呈现一个具有33个字符宽度和引号的RSA-key是很简单的

Console.WriteLine(Splitstring(RSAPubKey, 33, "\"", "\""));

输出:

希望有人觉得它有用…

其他回答

愚蠢的回答:写到一个临时文件,这样你就可以使用可敬的 文件。readline

var s = "Hello\r\nWorld";
var path = Path.GetTempFileName();
using (var writer = new StreamWriter(path))
{
    writer.Write(s);
}
var lines = File.ReadLines(path);

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

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

我目前在VB中使用这个函数(基于其他答案)。NET:

Private Shared Function SplitLines(text As String) As String()
    Return text.Split({Environment.NewLine, vbCrLf, vbLf}, StringSplitOptions.None)
End Function

它首先尝试在平台本地换行符上进行分割,然后退回到每个可能的换行符。

到目前为止,我只在一个类中需要这个。如果这种情况发生了变化,我可能会将此设置为Public并将其移动到实用程序类,甚至可能将其设置为扩展方法。

下面是如何重新加入队列的方法:

Private Shared Function JoinLines(lines As IEnumerable(Of String)) As String
    Return String.Join(Environment.NewLine, lines)
End Function

尽量避免使用字符串。分割是一种通用的解决方案,因为在使用函数的任何地方都会使用更多的内存——原始字符串和分割副本,都在内存中。相信我,当你开始扩展时,这可能是一个非常严重的问题——运行一个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();
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);
        }
    }
}