Bagaimana cara memasukkan baris baru dalam string literal?

155

Dalam. NET saya dapat memberikan keduanya \ratau \nstring literal, tetapi ada cara untuk memasukkan sesuatu seperti karakter "baris baru" seperti Environment.NewLineproperti statis?

Kapten Komik
sumber
9
Apa pertanyaannya?
iburlakov

Jawaban:

319

Nah, opsi sederhana adalah:

  • string.Format:

    string x = string.Format("first line{0}second line", Environment.NewLine);
  • Rangkaian string:

    string x = "first line" + Environment.NewLine + "second line";
  • Interpolasi string (dalam C # 6 dan di atas):

    string x = $"first line{Environment.NewLine}second line";

Anda juga dapat menggunakan \ n di mana-mana, dan mengganti:

string x = "first line\nsecond line\nthird line".Replace("\n",
                                                         Environment.NewLine);

Perhatikan bahwa Anda tidak dapat menjadikan ini string konstan , karena nilai Environment.NewLinehanya akan tersedia pada waktu eksekusi.

Jon Skeet
sumber
1
Yah, terima kasih tentu saja tapi saya bermaksud menghindari menggunakan Environment.NewLine, pertanyaan saya adalah apakah ada '/ baris baru' secara literal.
Kapten Komik
2
@ Kapten: Mengapa Anda ingin menghindari Environment.NewLine? Justru sebaliknya, itu adalah praktik yang baik untuk menggunakannya
abatishchev
18
@abatishchev: Di beberapa tempat itu latihan yang bagus. Di yang lain tidak. Anda benar-benar perlu tahu bahwa Anda ingin menggunakan platform khusus. Misalnya, itu bukan ide yang baik jika Anda menggunakan protokol jaringan yang harus mendefinisikan terminator garis itu sendiri.
Jon Skeet
1
@Captain Comic: Kalimat terakhir saya menjelaskan mengapa itu bukan pelarian harfiah - Anda tidak bisa memasukkannya dalam metadata untuk konstanta string, karena itu bukan nilai konstan.
Jon Skeet
1
Ya mungkin saya enggan menyebabkan kedua opsi: satu menggunakan operator plus dan kedua menggunakan metode Format cukup mahal di mana menyuntikkan '\ baris baru' literal akan menjadi cara tercepat. Tetapi seperti yang dikatakan Jon NewLine literal jika ada harus dinamis dan tergantung platform.
Kapten Komik
33

Jika Anda menginginkan string const yang berisi Environment.NewLine di dalamnya, Anda dapat melakukan sesuatu seperti ini:

const string stringWithNewLine =
@"first line
second line
third line";

EDIT

Karena ini dalam string const maka dilakukan dalam waktu kompilasi karena itu adalah interpretasi kompiler dari baris baru. Sepertinya saya tidak dapat menemukan referensi yang menjelaskan perilaku ini, tetapi, saya bisa membuktikannya berfungsi sebagaimana dimaksud. Saya mengkompilasi kode ini pada Windows dan Ubuntu (dengan Mono) kemudian dibongkar dan ini adalah hasilnya:

Bongkar di Windows Bongkar di Ubuntu

Seperti yang Anda lihat, di baris baru Windows ditafsirkan sebagai \ r \ n dan di Ubuntu sebagai \ n

Tal Jerome
sumber
1
Kompiler secara otomatis menambahkan Environment.NewLine di antara setiap baris dalam teks. Jadi string diinterpretasikan sebagai: "baris pertama" + Lingkungan. Baris Baru + "baris kedua" + Lingkungan. Baris Baru + "baris ketiga"
Tal Jerome
3
+1 Cara yang kurang dikenal untuk menyisipkan baris baru dalam string literal. Apakah ada referensi untuk perilaku yang Anda tentukan? Apakah ini benar-benar Environment.NewLine atau itu definisi kompiler dari baris baru?
Grimace of Despair
1
Apakah Anda yakin itu bukan karakter baris baru editor kode yang dimasukkan di sana? Jika Anda menyalin dan menempelkan kode itu ke editor di Windows, kode itu mungkin akan dikonversi ke \ r \ n. Lakukan hal yang sama pada platform seperti Unix dan itu mungkin akan dikonversi ke \ n sebagai gantinya.
Xiyng
Hati-hati dengan ini. Jika Anda checkout kode pada CI / CD server (seperti Teamcity, server side checkout) itu akan mengubah CRLF ke LF dan tidak akan ada baris baru dalam string.
Leszek P
13
var sb = new StringBuilder();
sb.Append(first);
sb.AppendLine(); // which is equal to Append(Environment.NewLine);
sb.Append(second);
return sb.ToString();
abatishchev
sumber
2
Mengapa Anda melakukan ini daripada menggunakan first + Environment.NewLine + secondyang lebih efisien dan (IMO) lebih mudah dibaca?
Jon Skeet
@ Jon: Lebih efisien, benarkah? Saya pikir itu String.Formatakan menghasilkan 1 string sekaligus (tapi secara internal agak lambat karena rangkaian budaya tertentu, dll), sementara rangkaian string - 1 menghasilkan +1 sementara, kan?
abatishchev
1
@abatishchev: kompiler mengubah str + str + str menjadi String.Concatenate, yang secara langsung membangun hanya satu string keluaran (IIRC, jika stringnya literal, penggabungannya dilakukan dalam kompiler.
Richard
@ Richard: yaitu penggabungan string beberapa tetapi satu baris ( "a"+b+"c"+d, dll) dengan kinerja sama dengan satu? Atau baru saja dikonversi ke String.Concatenate(a,b,c,d,etc), kan?
abatishchev
@abatishchev: Itu sebabnya saya tidak menyarankan string.Formatdalam komentar. Rangkaian string tidak akan menghasilkan string sementara, karena kompiler akan memanggil string.Concat(first, Environment.NewLine, second).
Jon Skeet
3

Satu lagi cara penempatan yang mudah dari Environment.NewLine dalam format string. Idenya adalah untuk membuat metode ekstensi string yang memformat string seperti biasa tetapi juga menggantikan {nl} dalam teks dengan Environment.NewLine

Pemakaian

   " X={0} {nl} Y={1}{nl} X+Y={2}".FormatIt(1, 2, 1+2);
   gives:
    X=1
    Y=2
    X+Y=3

Kode

    ///<summary>
    /// Use "string".FormatIt(...) instead of string.Format("string, ...)
    /// Use {nl} in text to insert Environment.NewLine 
    ///</summary>
    ///<exception cref="ArgumentNullException">If format is null</exception>
    [StringFormatMethod("format")]
    public static string FormatIt(this string format, params object[] args)
    {
        if (format == null) throw new ArgumentNullException("format");

        return string.Format(format.Replace("{nl}", Environment.NewLine), args);
    }

Catatan

  1. Jika Anda ingin ReSharper menyorot parameter Anda, tambahkan atribut ke metode di atas

    [StringFormatMethod ("format")]

  2. Implementasi ini jelas kurang efisien daripada hanya String.Format

  3. Mungkin satu, yang tertarik pada pertanyaan ini akan tertarik pada pertanyaan berikutnya juga: Named string formating in C #

MajesticRa
sumber
2
string myText =
    @"<div class=""firstLine""></div>
      <div class=""secondLine""></div>
      <div class=""thirdLine""></div>";

bukan itu:

string myText =
@"<div class=\"firstLine\"></div>
  <div class=\"secondLine\"></div>
  <div class=\"thirdLine\"></div>";
Hakki Eser
sumber
1
static class MyClass
{
   public const string NewLine="\n";
}

string x = "first line" + MyClass.NewLine + "second line"

sumber
3
-1: Sistem sudah mendefinisikan Environment.NewLine- lihat jawaban lainnya.
Richard
@ Richard: OP, sejauh yang saya bisa memahaminya, ingin menggunakan string literal inline, yaituconst string
abatishchev
@Richard Environment.NewLine statis bukan const
1

versi .net yang lebih baru memungkinkan Anda untuk menggunakan $ di depan literal yang memungkinkan Anda untuk menggunakan variabel di dalam seperti berikut:

var x = $"Line 1{Environment.NewLine}Line 2{Environment.NewLine}Line 3";
DanielK
sumber
1
Sedikit konteks tidak akan buruk.
croxy
1
Ini tidak memberikan jawaban untuk pertanyaan itu. Setelah memiliki reputasi yang cukup, Anda dapat mengomentari setiap pos ; alih-alih, berikan jawaban yang tidak memerlukan klarifikasi dari penanya . - Dari Ulasan
H. Pauwelyn
@ H.Pauwelyn ツ: Terima kasih atas umpan baliknya. Saya menambahkan sedikit konteks. Dari sudut pandang saya solusinya pasti menjawab pertanyaan itu.
DanielK
0

Jika Anda benar-benar menginginkan string Baris Baru sebagai konstanta, maka Anda dapat melakukan ini:

public readonly string myVar = Environment.NewLine;

Pengguna kata kunci hanya baca dalam C # berarti bahwa variabel ini hanya dapat ditetapkan satu kali. Anda dapat menemukan dokumentasi di sini . Ini memungkinkan deklarasi variabel konstan yang nilainya tidak diketahui sampai waktu eksekusi.

wizard07KSU
sumber
0

Saya lebih suka "cara pythonic"

List<string> lines = new List<string> {
    "line1",
    "line2",
    String.Format("{0} - {1} | {2}", 
        someVar,
        othervar, 
        thirdVar
    )
};

if(foo)
    lines.Add("line3");

return String.Join(Environment.NewLine, lines);
percebus
sumber
0

Jika Anda bekerja dengan aplikasi Web, Anda dapat mencoba ini.

StringBuilder sb = new StringBuilder();
sb.AppendLine("Some text with line one");
sb.AppendLine("Some mpre text with line two");
MyLabel.Text = sb.ToString().Replace(Environment.NewLine, "<br />")
Tejas Bagade
sumber
0

Jika saya mengerti pertanyaan: Pasangan "\r\n"untuk mendapatkan baris baru di bawah ini dalam textbox. Contoh saya berhasil -

   string s1 = comboBox1.Text;     // s1 is the variable assigned to box 1, etc.
   string s2 = comboBox2.Text;

   string both = s1 + "\r\n" + s2;
   textBox1.Text = both;

Sebuah jawaban yang khas bisa s1 s2 di text boxjenis gaya didefinisikan menggunakan.

Charles F
sumber
-1

Di sini, Environment.NewLine tidak bekerja.

Aku meletakkan " < br / > " dalam sebuah string dan bekerja.

Ex:

ltrYourLiteral.Text = "Baris pertama. <br /> Baris Kedua.";

Fábio
sumber