Was ist der einfachste Weg in C #, um eine neue Zeile von einer Zeichenfolge abzuschneiden?


115

Ich möchte sicherstellen, dass _content nicht mit einem NewLine-Zeichen endet:

_content = sb.ToString().Trim(new char[] { Environment.NewLine });

Der obige Code funktioniert jedoch nicht, da Trim anscheinend keinen überladenen Parameter für eine Sammlung von Zeichenfolgen hat, sondern nur Zeichen.

Was ist der einfachste Einzeiler, um eine Enivronment.Newline vom Ende einer Zeichenfolge zu entfernen?


4
Übrigens möchten Sie wahrscheinlich TrimEnd
Marc Gravell

Antworten:


258

Folgendes funktioniert für mich.

sb.ToString().TrimEnd( '\r', '\n' );

oder

sb.ToString().TrimEnd( Environment.NewLine.ToCharArray());

sehr prägnant und befasst sich mit dem \ r \ n Problem, nett
Edward Tanguay

1
Während das Trimmen JEDER Kombination von Zeichen, aus denen ein neues Zeilenzeichen besteht, das zugrunde liegende Problem und den Geist der Frage anspricht, besteht im allgemeinen Sinne auch die Möglichkeit unerwünschter Funktionen. In einem Dateiverarbeitungsszenario konnte ich feststellen, dass das erste \ n in einer Zeichenfolge von HeresALineForUnixToBeFedFromWindows \ n \ r \ n intakt bleiben muss. John Skeets Antwort ist zwar ausführlicher, aber wahrscheinlich die beste, und Scott Weinsteins ReadLine ist auch "genauer" (wenn auch mit etwas mehr Aufwand)
b_levitt

26
TrimEnd () erledigt den Job bereits ohne Parameter! msdn.microsoft.com/de-de/library/… und msdn.microsoft.com/de-de/library/…
Markus

3
@ Markus Danke Ich habe das gefunden, weil ich dieses Verhalten nicht will, aber es erlebt habe. Ich hatte den Eindruck, \ n war kein Leerzeichen, aber es ist und .TrimEnd und .Trim löschen alle Leerzeichen nativ
David Carrigan


14

Wie wäre es mit:

public static string TrimNewLines(string text)
{
    while (text.EndsWith(Environment.NewLine))
    {
        text = text.Substring(0, text.Length - Environment.NewLine.Length);
    }
    return text;
}

Es ist etwas ineffizient, wenn es mehrere Zeilenumbrüche gibt, aber es wird funktionieren.

Alternativ, wenn es Ihnen nichts ausmacht, zu trimmen (sagen wir) "\r\r\r\r"oder "\n\n\n\n"anstatt nur "\r\n\r\n\r\n":

// No need to create a new array each time
private static readonly char[] NewLineChars = Environment.NewLine.ToCharArray();

public static string TrimNewLines(string text)
{
    return text.TrimEnd(NewLineChars);
}

1
Wahrscheinlich die genaueste Lösung, aber kein Einzeiler :-)
Bang

9

Verwenden Sie das Framework. Die ReadLine () -Methode hat Folgendes zu sagen:

Eine Zeile ist definiert als eine Folge von Zeichen, gefolgt von einem Zeilenvorschub ("\ n"), einem Wagenrücklauf ("\ r") oder einem Wagenrücklauf, unmittelbar gefolgt von einem Zeilenvorschub ("\ r \ n"). Die zurückgegebene Zeichenfolge enthält weder den abschließenden Wagenrücklauf noch den Zeilenvorschub.

Das Folgende reicht also aus

_content = new StringReader(sb.ToString()).ReadLine();

1
Elegant ja, aber für andere, die diese Zeile lesen, nicht leicht zu verstehen. Benötigt einen erklärenden Kommentar (in der gleichen Zeile natürlich, um ein Einzeiler zu bleiben :))
Gumo

1
Nicht, wenn die Zeichenfolge mehr als eine Zeile enthält und Sie nur die letzte leere Zeile entfernen möchten.
Florian Berger

6

Wie wäre es mit

_content = sb.ToString().Trim(Environment.NewLine.ToCharArray());

Das ist nicht ganz dasselbe - es wird zum Beispiel "abc \ n \ n \ n \ n \ n" gekürzt, selbst wenn Environment.NewLine crlf ist
Marc Gravell

1
Deklariere es als Feature :-) Ich mag die Lösung.
Stefan Steinegger

5
_content = sb.TrimEnd(Environment.NewLine.ToCharArray());

Dadurch werden natürlich "\ r \ r \ r \ r" sowie "\ n \ n \ n \ n" und andere Kombinationen entfernt. Und in "Umgebungen", in denen NewLine nicht "\ n \ r" ist, kann es zu seltsamen Verhaltensweisen kommen :-)

Aber wenn Sie damit leben können, dann glaube ich, dass dies der effektivste Weg ist, neue Zeilenzeichen am Ende einer Zeichenfolge zu entfernen.


3

Wie wäre es einfach:

string text = sb.ToString().TrimEnd(null)

Dadurch werden alle Leerzeichen vom Ende der Zeichenfolge entfernt - nur dann ein Problem, wenn Sie Leerzeichen ohne Zeilenumbruch beibehalten möchten.


1

Eine Art Nichtantwort, aber der einfachste Weg, eine neue Zeile von einer Zeichenfolge abzuschneiden, besteht darin, die neue Zeile überhaupt nicht in der Zeichenfolge zu haben, indem sichergestellt wird, dass sie niemals von Ihrem eigenen Code gesehen wird. Das heißt, indem native Funktionen verwendet werden, die den Zeilenumbruch entfernen. Viele Stream- und File / Io-Methoden enthalten den Zeilenumbruch nicht, wenn Sie zeilenweise nach einer Ausgabe fragen. Möglicherweise muss jedoch etwas in a eingeschlossen werden System.IO.BufferedStream.

Dinge wie System.IO.File.ReadAllLineskönnen die System.IO.File.ReadAllTextmeiste Zeit ReadLineanstelle von verwendet werden und können verwendet werden, anstatt Readeinmal mit dem richtigen Stream-Typ zu arbeiten (z BufferedStream. B. ).


0

Wie Markus betonte, macht TrimEnd den Job jetzt. In der Windows Phone 7.8-Umgebung musste ich Zeilenvorschübe und Leerzeichen von beiden Enden der Zeichenfolge abrufen. Nachdem ich verschiedene komplexere Optionen verfolgt hatte, wurde mein Problem nur mit Trim () gelöst - die folgenden Tests wurden gut bestanden

   [TestMethod]
    [Description("TrimNewLines tests")]
    public void Test_TrimNewLines()
    {
        Test_TrimNewLines_runTest("\n\r     testi    \n\r", "testi");
        Test_TrimNewLines_runTest("\r     testi    \r", "testi");
        Test_TrimNewLines_runTest("\n     testi    \n", "testi");
        Test_TrimNewLines_runTest("\r\r\r\r\n\r     testi   \r\r\r\r \n\r", "testi");
        Test_TrimNewLines_runTest("\n\r  \n\n\n\n   testi äål.,    \n\r", "testi äål.,");
        Test_TrimNewLines_runTest("\n\n\n\n     testi  ja testi  \n\r\n\n\n\n", "testi  ja testi");
        Test_TrimNewLines_runTest("", "");
        Test_TrimNewLines_runTest("\n\r\n\n\r\n", "");
        Test_TrimNewLines_runTest("\n\r \n\n \n\n", "");
    }

    private static void Test_TrimNewLines_runTest(string _before, string _expected)
    {
        string _response = _before.Trim();
        Assert.IsTrue(_expected == _response, "string '" + _before + "' was translated to '" + _response + "' - should have been '" + _expected + "'");
    }

-2

Ich musste die neuen Zeilen im gesamten Text entfernen. Also habe ich verwendet:

            while (text.Contains(Environment.NewLine))
            {
                text = text.Substring(0, text.Length - Environment.NewLine.Length);
            }

1
Dies ist eine Katastrophe, wenn der Text NewLine (s) enthält, die nicht am Ende stehen.
Stefan Bergfeldt
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.