[C#] .NET에서 줄 바꿈으로 문자열을 나누는 가장 쉬운 방법은 무엇입니까?

.NET에서 문자열을 줄 바꿈으로 분할해야하며 문자열을 분할하는 유일한 방법은 Split 메서드를 사용하는 것입니다. 그러나 그렇게하면 개행 문자를 (쉽게) 나눌 수 없으므로 최선의 방법은 무엇입니까?



답변

문자열을 분할하려면 문자열 배열을 취하는 오버로드를 사용해야합니다.

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

편집 :
텍스트에서 다른 유형의 줄 바꿈을 처리하려면 둘 이상의 문자열을 일치시키는 기능을 사용할 수 있습니다. 이렇게하면 줄 바꿈 유형 중 하나에서 올바르게 분할되고 텍스트에 빈 줄과 간격이 유지됩니다.

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


답변

를 사용하는 것은 StringReader어떻습니까?

using (System.IO.StringReader reader = new System.IO.StringReader(input)) {
    string line = reader.ReadLine();
}


답변

다음과 같이 문자열을 아주 쉽게 분리 할 수 ​​있어야합니다.

aString.Split(Environment.NewLine.ToCharArray());


답변

문자열을 사용하지 마십시오. 일반 솔루션의 경우, 함수에서 사용하는 모든 위치 (원래 문자열 및 분할 복사본)를 메모리에서 더 많이 사용하므로 일반적인 솔루션으로 분할하십시오. 100MB 문서를 처리하는 32 비트 일괄 처리 응용 프로그램을 실행하면 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();


답변

Guffa의 답변에 따라 확장 클래스에서 다음을 사용하십시오.

public static string[] Lines(this string source) {
    return source.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
}


답변

문자열 변수의 경우 s:

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

이것은 환경의 줄 끝 정의를 사용합니다. Windows에서 줄 끝은 CR-LF (캐리지 리턴, 줄 바꿈) 또는 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과 같은 마크 업이 중단되므로을 사용하십시오 .
  • new char[]{Environment.NewLine}Windows에서는 각 줄마다 빈 문자열 요소가 하나씩 만들어 지므로 separator 에서 split .

답변

정규식도 옵션입니다.

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