Jaki jest najłatwiejszy sposób w C #, aby przyciąć nowy wiersz z ciągu?


115

Chcę się upewnić, że _content nie kończy się znakiem NewLine:

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

ale powyższy kod nie działa, ponieważ Trim wydaje się nie mieć przeciążonego parametru dla kolekcji ciągów, tylko znaki.

Jaka jest najprostsza jedna linijka do usunięcia Enivronment.Newline z końca łańcucha?


4
przy okazji, prawdopodobnie chcesz TrimEnd
Marc Gravell

Odpowiedzi:


260

Poniższe działa dla mnie.

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

lub

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

bardzo zwięzły i zajmuje się problemem \ r \ n, fajnie
Edward Tanguay

1
Chociaż przycinanie DOWOLNEJ kombinacji znaków, które tworzą znak (i) nowego wiersza, rozwiązuje podstawowy problem i ducha pytania, pozostawia również możliwość niepożądanej funkcjonalności w ogólnym sensie. W senario przetwarzania plików mogłem zobaczyć potrzebę pozostawienia pierwszego \ n nienaruszonego ciągu HeresALineForUnixToBeFedFromWindows \ n \ r \ n. Chociaż bardziej rozwlekła, odpowiedź Johna Skeeta jest prawdopodobnie najlepsza, a ReadLine Scotta Weinsteina jest również bardziej „dokładny” (choć może z nieco większym narzutem)
b_levitt,

26
TrimEnd () już wykonuje zadanie bez żadnych parametrów! msdn.microsoft.com/de-de/library/… i msdn.microsoft.com/de-de/library/…
Markus

3
@Markus Dzięki, znalazłem to, ponieważ nie chcę tego zachowania, ale go doświadczałem. Miałem wrażenie, że \ n nie była to biała spacja, ale tak jest i .TrimEnd i .Trim natywnie usuwa wszystkie białe znaki
David Carrigan


14

Co powiesz na:

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

Jest to trochę nieefektywne, jeśli jest wiele nowych linii, ale zadziała.

Alternatywnie, jeśli nie masz nic przeciwko przycinaniu (powiedzmy) "\r\r\r\r"lub "\n\n\n\n"raczej "\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
Prawdopodobnie najdokładniejsze rozwiązanie, ale nie jednoliniowe :-)
huk

9

Użyj Framework. Metoda ReadLine () ma do powiedzenia:

Linia jest zdefiniowana jako sekwencja znaków, po której następuje wysunięcie wiersza („\ n”), powrót karetki („\ r”) lub powrót karetki, po którym bezpośrednio następuje wysunięcie wiersza („\ r \ n”). Zwracany ciąg nie zawiera końcowego powrotu karetki ani końca wiersza.

Więc poniższe rozwiązanie załatwi sprawę

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

1
Eleganckie tak, ale niełatwe do zrozumienia dla innych czytających ten wiersz. Potrzebuje komentarza wyjaśniającego (oczywiście w tej samej linii, aby pozostać
jednolinijkowym

1
Nie działa, gdy łańcuch ma więcej niż jedną linię, a chcesz usunąć tylko ostatnią pustą linię.
Florian Berger

6

Co powiesz na

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

To nie robi dokładnie tego samego - na przykład przycina "abc \ n \ n \ n \ n \ n", nawet jeśli Environment.NewLine ma wartość crlf
Marc Gravell

1
Zadeklaruj to jako funkcję :-) Podoba mi się to rozwiązanie.
Stefan Steinegger

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

Spowoduje to oczywiście usunięcie "\ r \ r \ r \ r", jak również "\ n \ n \ n \ n" i innych kombinacji. A w „środowiskach”, w których Nowa Linia jest inna niż „\ n \ r”, możesz uzyskać dziwne zachowania :-)

Ale jeśli możesz z tym żyć, to uważam, że jest to najbardziej skuteczny sposób usuwania znaków nowego wiersza na końcu ciągu.


3

Może po prostu:

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

Spowoduje to ściągnięcie wszystkich białych znaków z końca łańcucha - tylko problem, jeśli chcesz zachować białe znaki inne niż znaki nowej linii.


1

Trochę brak odpowiedzi, ale najłatwiejszym sposobem obcięcia nowej linii z łańcucha jest przede wszystkim nie umieszczanie nowej linii w łańcuchu, upewniając się, że nigdy nie zostanie ona zauważona przez Twój własny kod. To znaczy, używając natywnych funkcji, które usuwają znak nowej linii. Wiele metod stream i file / io nie będzie zawierało znaku nowej linii, jeśli poprosisz o wyjście wiersz po wierszu, chociaż może być konieczne zawinięcie czegoś wSystem.IO.BufferedStream .

Takie rzeczy System.IO.File.ReadAllLinesmogą być używane zamiast tego przez System.IO.File.ReadAllTextwiększość czasu i ReadLinemogą być używane zamiast Readpracy z odpowiednim typem strumienia (np BufferedStream.).


0

Jak zauważył Markus, TrimEnd wykonuje teraz swoją pracę. W środowisku Windows Phone 7.8 potrzebowałem wysunięcia wiersza i odstępów na obu końcach ciągu. Po pogoni za różnymi, bardziej złożonymi opcjami mój problem został rozwiązany za pomocą tylko Trim () - ładnie przeszedł poniższe testy

   [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

Musiałem usunąć nowe linie z całego tekstu. Więc użyłem:

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

1
To będzie katastrofa, jeśli tekst zawiera nową linię, która nie jest na końcu.
Stefan Bergfeldt
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.