Apa cara termudah di C # untuk memangkas baris baru dari string?

115

Saya ingin memastikan bahwa _content tidak diakhiri dengan karakter NewLine:

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

tetapi kode di atas tidak berfungsi karena Trim tampaknya tidak memiliki parameter yang kelebihan beban untuk kumpulan string, hanya karakter.

Apa satu-baris paling sederhana untuk menghapus Enivronment.Newline dari ujung string?

Edward Tanguay
sumber
4
btw, Anda mungkin ingin TrimEnd
Marc Gravell

Jawaban:

260

Berikut ini bekerja untuk saya.

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

atau

sb.ToString().TrimEnd( Environment.NewLine.ToCharArray());
Simon Wilson
sumber
sangat ringkas dan menangani masalah \ r \ n, bagus
Edward Tanguay
1
Meskipun memangkas kombinasi karakter APA PUN yang membentuk karakter baris baru tidak mengatasi masalah yang mendasari dan semangat pertanyaan, hal itu juga meninggalkan potensi fungsionalitas yang tidak diinginkan dalam pengertian umum. Dalam senario pemrosesan file saya bisa melihat kebutuhan untuk meninggalkan \ n pertama utuh dalam string HeresALineForUnixToBeFedFromWindows \ n \ r \ n. Meskipun lebih bertele-tele, jawaban John Skeet mungkin yang terbaik dan ReadLine Scott Weinstein juga lebih "akurat" (meskipun mungkin dengan sedikit lebih banyak overhead)
b_levitt
26
TrimEnd () sudah melakukan Pekerjaan tanpa Parameter apa pun! msdn.microsoft.com/de-de/library/… dan msdn.microsoft.com/de-de/library/…
Markus
3
@Markus Terima kasih saya menemukan ini karena saya tidak ingin perilaku ini tetapi mengalaminya. Saya mendapat kesan \ n bukan spasi tetapi itu dan .TrimEnd dan .Trim hapus semua karakter spasi putih asli
David Carrigan
39

.Trim()menghapus \r\nuntuk saya (menggunakan .NET 4.0).

xr280xr
sumber
14

Bagaimana tentang:

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

Agak tidak efisien jika ada beberapa baris baru, tetapi itu akan berhasil.

Atau, jika Anda tidak keberatan memangkas (katakanlah) "\r\r\r\r"atau "\n\n\n\n"bukan hanya "\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);
}
Jon Skeet
sumber
1
Mungkin solusi paling akurat, tetapi bukan satu-baris :-)
bang
9

Gunakan Kerangka. Metode ReadLine () mengatakan hal berikut:

Garis didefinisikan sebagai urutan karakter yang diikuti oleh umpan baris ("\ n"), carriage return ("\ r") atau carriage return segera diikuti dengan umpan baris ("\ r \ n"). String yang dikembalikan tidak berisi carriage return atau line feed yang mengakhiri.

Jadi berikut ini akan melakukan triknya

_content = new StringReader(sb.ToString()).ReadLine();
Scott Weinstein
sumber
1
Elegan ya, tapi tidak mudah dimengerti oleh orang lain yang membaca baris ini. Membutuhkan komentar yang menjelaskan (dalam baris yang sama tentu saja untuk tetap satu baris :))
gumo
1
Tidak jika string memiliki lebih dari satu baris dan Anda hanya ingin menghapus baris kosong terakhir.
Florian Berger
6

Bagaimana dengan

_content = sb.ToString().Trim(Environment.NewLine.ToCharArray());
heavyd
sumber
Yang tidak melakukan cukup hal yang sama - itu akan memangkas "abc \ n \ n \ n \ n \ n" misalnya, bahkan jika Environment.NewLine adalah crlf
Marc Gravell
1
Deklarasikan sebagai fitur :-) Saya suka solusinya.
Stefan Steinegger
5
_content = sb.TrimEnd(Environment.NewLine.ToCharArray());

Ini tentu saja akan menghapus "\ r \ r \ r \ r" serta "\ n \ n \ n \ n" dan kombinasi lainnya. Dan di "lingkungan" di mana NewLine selain "\ n \ r" Anda mungkin mendapatkan beberapa perilaku aneh :-)

Tetapi jika Anda bisa hidup dengan ini maka saya percaya ini adalah cara paling efektif untuk menghapus karakter baris baru di akhir string.

bang
sumber
3

Bagaimana dengan:

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

Itu akan menarik semua karakter spasi dari akhir string - hanya masalah jika Anda ingin mempertahankan spasi kosong non-baris baru.

Richard Dunlap
sumber
1

Agak bukan jawaban, tetapi cara termudah untuk memangkas baris baru dari string adalah dengan tidak menempatkan baris baru pada string di tempat pertama, dengan memastikan itu tidak pernah terlihat oleh kode Anda sendiri. Artinya, dengan menggunakan fungsi asli yang menghapus baris baru. Banyak metode stream dan file / io tidak akan menyertakan baris baru jika Anda meminta keluaran baris demi baris, meskipun mungkin perlu untuk membungkus sesuatu dalam file System.IO.BufferedStream.

Hal-hal seperti System.IO.File.ReadAllLinesdapat digunakan di System.IO.File.ReadAllTextsebagian besar waktu, dan ReadLinedapat digunakan sebagai pengganti Readsetelah Anda bekerja dengan jenis aliran yang tepat (misalnya BufferedStream).

Brian
sumber
0

Seperti yang ditunjukkan Markus, TrimEnd sedang melakukan pekerjaan itu sekarang. Saya perlu mendapatkan feed baris dan spasi dari kedua ujung string di lingkungan Windows Phone 7.8. Setelah mengejar berbagai opsi yang lebih kompleks, masalah saya diselesaikan dengan hanya menggunakan Trim () - lulus tes berikut dengan baik

   [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 + "'");
    }
juhariis
sumber
-2

Saya harus menghapus baris baru di seluruh teks. Jadi saya menggunakan:

            while (text.Contains(Environment.NewLine))
            {
                text = text.Substring(0, text.Length - Environment.NewLine.Length);
            }
Ekaterina
sumber
1
Ini akan menjadi bencana jika teks berisi NewLine (s) yang tidak ada di bagian akhir.
Stefan Bergfeldt