Zeilenumbruch in StringBuilder

88

Wie hängt man ein neues Zeilenzeichen (\ n \ r) an StringBuilder?

user274364
quelle
16
Das ist keine neue Zeile unter einem gängigen Betriebssystem. Windows ist \ r \ n, Mac ist \ r, Unix und Linux sind \ n.
Ben Voigt
2
Pedantisch ist 'newline' immer '\ n'. Es war der Platten-Shift-Charakter bei mechanischen Teletypen. 'Wagenrücklauf' ist immer '\ r'. Es war das Wagenrücklaufzeichen in Teletypen. Jedes Betriebssystem kann sie unterschiedlich interpretieren. Unter Unix / Linux wird die Rückgabe im Allgemeinen nicht verwendet, da sie nicht erforderlich ist, da es sich nicht mehr um ein mechanisches System handelt.
Jay
6
@Jay: Ein Zeichen, das nur eine Plattenverschiebung verursacht, wird nicht als Zeilenumbruch, sondern als Zeilenvorschub bezeichnet.
Ben Voigt

Antworten:

125

Ich würde die Environment.NewLine-Eigenschaft verwenden .

Etwas wie:

StringBuilder sb = new StringBuilder();
sb.AppendFormat("Foo{0}Bar", Environment.NewLine);
string s = sb.ToString();

Oder

StringBuilder sb = new StringBuilder();
sb.Append("Foo");
sb.Append("Foo2");
sb.Append(Environment.NewLine);
sb.Append("Bar");
string s = sb.ToString();

Wenn Sie nach jedem Anhängen eine neue Zeile haben möchten, können Sie sich die Antwort von Ben Voigt ansehen .

Adriaan Stander
quelle
2
Es ist möglich, Append und AppendLine zu mischen, um neue Zeilen dort zu erhalten, wo Sie sie möchten, und nicht nach jedem Append. Außerdem habe ich auf die Null-Argument-Version von AppendLine verlinkt, die nur die Zeilenumbruchsequenz anfügt.
Ben Voigt
4
Stringbuilder.AppendLine () macht dasselbe wie sb.Append (Environment.NewLine); Es ist auch ordentlicher, würde ich sagen ( msdn.microsoft.com/en-us/library/ebk18257.aspx )
Mulki
3
Beachten Sie, dass Environment.NewLine auf Unix-Systemen nicht "\ r \ n" lautet. Wenn Sie also etwas implementieren, das als "\ r \ n" angegeben ist, müssen Sie es in den Code schreiben, anstatt AppendLine aufzurufen.
Hultqvist
1
@hultqvist: Besser AppendLineauf einem StreamWriter zu verwenden, dann wird die für diese bestimmte StreamWriterund nicht nur für diese bestimmte Zeile geeignete Zeilenumbruchsequenz eingefügt Environment.NewLine. Wenn Sie beispielsweise einen Stream öffnen, der an eine SMTP-Verbindung gebunden ist, können Sie seine NewLineEigenschaft auf "\ r \ n" setzen, und Sie erhalten auch unter Unix einen gültigen SMTP-Handshake.
Ben Voigt
1
AppendLine ist einfacher als diese Methode.
Antonio Mano
75

Mit der AppendLine-Methode .

َََ

Ben Voigt
quelle
Dies wäre schön, wenn es die gleiche Anzahl von Überladungen wie Append () hätte. Sieht aus wie ein Versehen.
user441521
5

Es wird \nstattdessen unter Linux angehängt \r\n.

Kerry Jiang
quelle
4

Verwenden Sie die in StringBuilder integrierten Funktionen zum Anhängen von Zeilen:

StringBuilder sb = new StringBuilder();
sb.AppendLine("First line");
sb.AppendLine("Second line");
sb.AppendLine("Third line");

Ausgabe

First line
Second line
Third line
Lijo
quelle
2
StringBuilder sb = new StringBuilder();

Sie können sb.AppendLine () oder sb.Append (Environment.NewLine) verwenden .

Janmejay Kumar
quelle
1

Für mehrere Zeilen finde ich am besten Folgendes:

        IEnumerable<string> lines = new List<string>
        {
            string.Format("{{ line with formatting... {0} }}", id),
            "line 2",
            "line 3"
        };
        StringBuilder sb = new StringBuilder();
        foreach(var line in lines)
            sb.AppendLine(line);

Auf diese Weise müssen Sie den Bildschirm nicht überladen, wenn Environment.NewLine oder AppendLine () mehrmals wiederholt werden. Es ist auch weniger fehleranfällig, als daran denken zu müssen, sie einzugeben.

user859400
quelle
1

Erstellen Sie einfach eine Erweiterung für die StringBuilder-Klasse:

Public Module Extensions
    <Extension()>
    Public Sub AppendFormatWithNewLine(ByRef sb As System.Text.StringBuilder, ByVal format As String, ParamArray values() As Object)
        sb.AppendLine(String.Format(format, values))
    End Sub
End Module
Paul Ishak
quelle