我需要在. 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对象,以便在处理字符串时可以使用它作为一个自然的方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Collections.ObjectModel;

namespace System
{
    public static class StringExtensions
    {
        public static string[] Split(this string s, string delimiter, StringSplitOptions options = StringSplitOptions.None)
        {
            return s.Split(new string[] { delimiter }, options);
        }
    }
}

你现在可以从任何字符串中使用.Split()函数,如下所示:

string[] result;

// Pass a string, and the delimiter
result = string.Split("My simple string", " ");

// Split an existing string by delimiter only
string foo = "my - string - i - want - split";
result = foo.Split("-");

// You can even pass the split options parameter. When omitted it is
// set to StringSplitOptions.None
result = foo.Split("-", StringSplitOptions.RemoveEmptyEntries);

要在换行符上进行分割,只需传递“\n”或“\r\n”作为分隔符参数。

评论:如果微软能实现这个重载就太好了。

尽量避免使用字符串。分割是一种通用的解决方案,因为在使用函数的任何地方都会使用更多的内存——原始字符串和分割副本,都在内存中。相信我,当你开始扩展时,这可能是一个非常严重的问题——运行一个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 str = "Test Me\r\nTest Me\nTest Me";
        var splitted = str.Split('\n').Select(s => s.Trim()).ToArray();

额外的. trim删除了任何可能仍然存在的\r或\n(例如在windows上,但是用os x换行符分隔字符串)。可能不是最快的方法。

编辑:

正如注释所正确指出的那样,这也会删除行开头或新换行之前的任何空白。如果需要保留空白,请使用其他选项之一。

这里的示例非常棒,帮助我解决了当前的“挑战”,以一种更可读的方式分割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, "\"", "\""));

输出:

希望有人觉得它有用…

其实很简单。

VB。NET:

Private Function SplitOnNewLine(input as String) As String
    Return input.Split(Environment.NewLine)
End Function

C#:

string splitOnNewLine(string input)
{
    return input.split(environment.newline);
}