Easiest way to split a string on newlines in .NET?

后端 未结 16 2331
抹茶落季
抹茶落季 2020-11-22 06:57

I need to split a string into newlines in .NET and the only way I know of to split strings is with the Split method. However that will not allow me to (easily) split on a ne

相关标签:
16条回答
  • 2020-11-22 07:21

    What about using a StringReader?

    using (System.IO.StringReader reader = new System.IO.StringReader(input)) {
        string line = reader.ReadLine();
    }
    
    0 讨论(0)
  • 2020-11-22 07:21

    I'm currently using this function (based on other answers) in VB.NET:

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

    It tries to split on the platform-local newline first, and then falls back to each possible newline.

    I've only needed this inside one class so far. If that changes, I will probably make this Public and move it to a utility class, and maybe even make it an extension method.

    Here's how to join the lines back up, for good measure:

    Private Shared Function JoinLines(lines As IEnumerable(Of String)) As String
        Return String.Join(Environment.NewLine, lines)
    End Function
    
    0 讨论(0)
  • 2020-11-22 07:22

    Regex is also an option:

        private string[] SplitStringByLineFeed(string inpString)
        {
            string[] locResult = Regex.Split(inpString, "[\r\n]+");
            return locResult;
        }
    
    0 讨论(0)
  • 2020-11-22 07:25

    Try to avoid using string.Split for a general solution, because you'll use more memory everywhere you use the function -- the original string, and the split copy, both in memory. Trust me that this can be one hell of a problem when you start to scale -- run a 32-bit batch-processing app processing 100MB documents, and you'll crap out at eight concurrent threads. Not that I've been there before...

    Instead, use an iterator like this;

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

    This will allow you to do a more memory efficient loop around your data;

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

    Of course, if you want it all in memory, you can do this;

    var allTheLines = document.SplitToLines.ToArray();
    
    0 讨论(0)
  • 2020-11-22 07:26
    string[] lines = text.Split(
      Environment.NewLine.ToCharArray(), 
      StringSplitOptions.RemoveEmptyStrings);
    

    The RemoveEmptyStrings option will make sure you don't have empty entries due to \n following a \r

    (Edit to reflect comments:) Note that it will also discard genuine empty lines in the text. This is usually what I want but it might not be your requirement.

    0 讨论(0)
  • 2020-11-22 07:28

    You should be able to split your string pretty easily, like so:

    aString.Split(Environment.NewLine.ToCharArray());
    
    0 讨论(0)
提交回复
热议问题