Dize değişmezine satırsonu nasıl eklenir?


155

.NET'te ben \rveya \ndize değişmezleri sağlayabilir , ancak Environment.NewLinestatik özellik gibi "yeni satır" özel karakter gibi bir şey eklemek için bir yolu var mı?


9
Soru nedir?
iburlakov

Yanıtlar:


319

Basit seçenekler:

  • string.Format:

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

    string x = "first line" + Environment.NewLine + "second line";
  • Dize enterpolasyonu (C # 6 ve üzeri):

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

Ayrıca her yerde \ n kullanabilirsiniz ve şunu değiştirebilirsiniz:

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

Değerini yalnızca yürütme zamanında kullanılabilir olacağından , bunu bir dize sabit yapamayacağınızı unutmayın Environment.NewLine.


1
Tabii ki teşekkürler ama ben Environment.NewLine kullanmaktan kaçınmak istedim.
Kaptan Comic

2
@Captain: Neden kaçınmak istiyorsun Environment.NewLine? Tam tersine, bunu kullanmak için iyi bir uygulamadır
abatishchev

18
@abatishchev: Bazı yerlerde iyi uygulama. Diğerlerinde değil. Platforma özgü olanı kullanmak istediğinizi gerçekten bilmeniz gerekir. Örneğin, hat sonlandırıcılarının kendisini tanımlaması gereken bir ağ protokolü kullanmanız iyi bir fikir değildir .
Jon Skeet

1
@Captain Comic: Son cümlemim neden gerçek bir kaçış olamayacağını açıklıyor - sabit bir değer olmadığı için dize sabitinin meta verilerine ekleyemezsiniz .
Jon Skeet

1
Evet, her iki seçeneğe de neden olmamaya istekli olabilirim: biri artı operatör ve ikincisi Biçim yöntemini kullanarak '\ newline' değişmezinin enjekte edilmesinin en hızlı yol olduğu bir yük. Ancak Jon'un söylediği gibi, eğer varsa NewLine hazır bilgisi dinamik ve platforma bağımlı olmak zorundaydı.
Kaptan Çizgi Roman

33

İçinde Environment.NewLine içeren bir const dizesi istiyorsanız, bunun gibi bir şey yapabilirsiniz:

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

DÜZENLE

Bu bir sabit dizgide olduğu için derleme zamanında yapılır, bu nedenle derleyicinin bir satırsonu yorumudur. Bu davranışı açıklayan bir referans bulamıyorum ama amaçlandığı gibi çalıştığını kanıtlayabilirim. Bu kodu hem Windows hem de Ubuntu'da (Mono ile) derledikten sonra demonte ettik ve sonuçlar:

Windows'ta Sökme Ubuntu'da sökün

Gördüğünüz gibi, Windows'ta yeni satırlar \ r \ n ve Ubuntu'da \ n olarak yorumlanıyor


1
Derleyici, metnin her satırı arasına otomatik olarak bir Environment.NewLine ekler. Bu nedenle dize şu şekilde yorumlanır: "ilk satır" + Environment.NewLine + "ikinci satır" + Environment.NewLine + "üçüncü satır"
Tal Jerome 29:13

3
+1 Dize değişmezlerine satırsonu eklemenin az bilinen yolu. Belirttiğiniz davranış için herhangi bir referans var mı? Gerçekten Environment.NewLine mi yoksa yeni satırın derleyici tanımı mı?
Umutsuzluğun Yüz burcu

1
Kod düzenleyicinin buraya eklenen yeni satır karakteri olmadığından emin misiniz? Bu kodu Windows'ta bir düzenleyiciye kopyalayıp yapıştırırsanız, büyük olasılıkla \ r \ n biçimine dönüştürülür. Aynısını Unix benzeri bir platformda yapın ve bunun yerine büyük olasılıkla \ n'ye dönüştürülecektir.
Xiyng

Bununla dikkat edin. CI / CD sunucusunda ödeme kodu alırsanız (Teamcity, sunucu tarafı ödeme gibi), CRLF'yi LF olarak değiştirir ve dizede yeni satırlar olmaz.
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();

2
Bunu first + Environment.NewLine + seconddaha verimli ve (IMO) okunması daha kolay kullanmak yerine neden yapasınız ki ?
Jon Skeet

@Jon: Daha verimli, gerçekten mi? Ben bir String.Formatkerede 1 dize üretecek düşündüm (ama iç kültür biraz birleştirme, vb nedeniyle biraz yavaş), dize birleştirme - 1 sonuç + 1 geçici, değil mi?
abatishchev

1
@abatishchev: derleyici str + str + str'yi String.Concatenatedoğrudan dönüştürür , bu da sadece bir çıkış dizesi oluşturur (IIRC, dizeler değişmezse derleme derleyicide yapılır.
Richard

@Richard: yani performansa göre çoklu ama tek satırlık dize birleştirme ( "a"+b+"c"+dvb.) Tek bir diziye eşit mi? Ya da sadece dönüştürülmüş String.Concatenate(a,b,c,d,etc), değil mi?
abatishchev

@abatishchev: Bu yüzden string.Formatyorumda önermedim . Derleyici arayacağı için dize birleştirme geçici dizeler üretmez string.Concat(first, Environment.NewLine, second).
Jon Skeet

3

Biçim dizgisine Ortam.YeniLine'nin uygun bir şekilde yerleştirilmesinin bir başka yolu. Buradaki fikir, dizeyi her zamanki gibi biçimlendiren ancak metindeki {nl} yerine Environment.NewLine ile yer değiştiren dize genişletme yöntemi oluşturmaktır.

kullanım

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

kod

    ///<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);
    }

Not

  1. ReSharper'ın parametrelerinizi vurgulamasını istiyorsanız, yukarıdaki yönteme nitelik ekleyin

    [StringFormatMethod ( "biçimi")]

  2. Bu uygulama sadece String.Format'tan daha az verimlidir

  3. Belki bu soruyla ilgilenen bir sonraki soruya da ilgi duyacaktır: C # olarak adlandırılmış dize biçimlendirme


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

Bu değil:

string myText =
@"<div class=\"firstLine\"></div>
  <div class=\"secondLine\"></div>
  <div class=\"thirdLine\"></div>";

1
static class MyClass
{
   public const string NewLine="\n";
}

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

3
-1: Sistem zaten tanımlar Environment.NewLine- diğer yanıtlara bakın.
Richard

@Richard: OP, anlayabildiğim kadarıyla, satır içi dize değişmezi kullanmak istiyor, yaniconst string
abatishchev

@Richard Environment.NewLine sabit değil const

1

daha yeni .net sürümleri, değişkenleri aşağıdaki gibi kullanmanıza izin veren değişmezin önünde $ kullanmanızı sağlar:

var x = $"Line 1{Environment.NewLine}Line 2{Environment.NewLine}Line 3";

1
Biraz bağlam kötü olmaz.
croxy

1
Bu soruya bir cevap vermez. Yeterli bir üne sahip olduğunuzda , herhangi bir yazı hakkında yorum yapabilirsiniz ; bunun yerine askerden açıklama gerektirmeyen cevaplar verin . - İncelemeden
H. Pauwelyn

@ H.Pauwelyn ツ: Geri bildirim için teşekkürler. Biraz bağlam ekledim. Benim açımdan çözüm kesinlikle soruyu cevaplıyor.
DanielK

0

Yeni Çizgi dizesini gerçekten bir sabit olarak istiyorsanız, bunu yapabilirsiniz:

public readonly string myVar = Environment.NewLine;

C # içindeki salt okunur anahtar kelimenin kullanıcısı, bu değişkenin yalnızca bir kez atanabileceği anlamına gelir. Üzerinde belgeleri burada bulabilirsiniz . Yürütme süresine kadar değeri bilinmeyen sabit bir değişkenin bildirilmesine izin verir.


0

"Pitonik yolu" daha çok seviyorum

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);

0

Web uygulamasıyla çalışıyorsanız bunu deneyebilirsiniz.

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 />")

0

Soruyu anlarsam: "\r\n"Aşağıdaki yeni satırı almak için bir çift textbox. Örneğim çalıştı -

   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;

Tipik bir cevap olabilir s1 s2 de text boxkullanarak tanımlı tür stili.


-1

Burada, Environment.NewLine çalışmadı.

Ben bir "koymak < br / > " bir dizede ve çalıştı.

Ör:

ltrYourLiteral.Text = "Birinci satır <. br / > İkinci satır.";

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.