c# - строку - с# работа со строками




Самый простой способ разделить строку на новые строки в.NET? (10)

Regex также является опцией:

    private string[] SplitStringByLineFeed(string inpString)
    {
        string[] locResult = Regex.Split(inpString, "[\r\n]+");
        return locResult;
    }

Мне нужно разбить строку на новые строки в .NET, и единственный способ разделить строки - это метод Split . Однако это не позволит мне (легко) расколоться на новой строке, так что это лучший способ сделать это?


В настоящее время я использую эту функцию (на основе других ответов) в 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

Глупый ответ: напишите во временный файл, чтобы вы могли использовать почтенный File.ReadLines

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

Для строковой переменной s :

s.Split(new string[]{Environment.NewLine},StringSplitOptions.None)

Это использует определение контуров вашей среды. В Windows окончание строк - CR-LF (возврат каретки, подача строки) или в escape-символы C # \r\n .

Это надежное решение, потому что если вы рекомбинируете строки с String.Join , это будет равно вашей исходной строке:

var lines = s.Split(new string[]{Environment.NewLine},StringSplitOptions.None);
var reconstituted = String.Join(Environment.NewLine,lines);
Debug.Assert(s==reconstituted);

Чего не делать:

  • Используйте StringSplitOptions.RemoveEmptyEntries , потому что это нарушит разметку, такую ​​как Markdown, где пустые строки имеют синтаксическую цель.
  • Split on separator new char[]{Environment.NewLine} , потому что в Windows это создаст один пустой строковый элемент для каждой новой строки.

На самом деле очень просто.

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

Ну, на самом деле раскол должен делать:

//Constructing string...
StringBuilder sb = new StringBuilder();
sb.AppendLine("first line");
sb.AppendLine("second line");
sb.AppendLine("third line");
string s = sb.ToString();
Console.WriteLine(s);

//Splitting multiline string into separate lines
string[] splitted = s.Split(new string[] {System.Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries);

// Output (separate lines)
for( int i = 0; i < splitted.Count(); i++ )
{
    Console.WriteLine("{0}: {1}", i, splitted[i]);
}

Просто подумал, что я добавлю свои два бита, потому что другие решения по этому вопросу не относятся к классификации многоразового кода и не удобны. Следующий блок кода расширяет 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 param. when omitted it is
// set to StringSplitOptions.None
result = foo.Split("-", StringSplitOptions.RemoveEmptyEntries);

Для разделения на символ новой строки просто передайте "\n" или "\r\n" в качестве параметра разделителя.

Комментарий: Было бы неплохо, если бы Microsoft реализовала эту перегрузку.


Старайтесь не использовать string.Split для общего решения, потому что вы будете использовать больше памяти везде, где вы используете функцию - исходную строку и разделенную копию, как в памяти. Поверьте мне, что это может быть одной из проблем, когда вы начинаете масштабироваться - запустите 32-битное пакетное приложение, обрабатывающее 100 МБ документов, и вы сможете использовать восемь одновременных потоков. Не то чтобы я был там раньше ...

Вместо этого используйте итератор;

    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();

Я не знал о Environment.Newline, но я думаю, это очень хорошее решение.

Моя попытка была бы:

        string str = "Test Me\r\nTest Me\nTest Me";
        var splitted = str.Split('\n').Select(s => s.Trim()).ToArray();

Дополнительный .Trim удаляет любые \ r или \ n, которые могут быть все еще присутствующими (например, когда на окнах, но разделение строки на символы os x newline). Наверное, не самый быстрый способ.

РЕДАКТИРОВАТЬ:

Как правильно отметили комментарии, это также удаляет любые пробелы в начале строки или перед новой подачей строки. Если вам нужно сохранить этот пробел, используйте один из других вариантов.


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




split