文字列リテラルに改行を挿入するにはどうすればよいですか?


155

.NETでは両方\rまたは\n文字列リテラルを提供できますが、Environment.NewLine静的プロパティのような「改行」特殊文字のようなものを挿入する方法はありますか?


9
質問は何ですか?
iburlakov

回答:


319

まあ、単純なオプションは次のとおりです。

  • string.Format

    string x = string.Format("first line{0}second line", Environment.NewLine);
  • 文字列連結:

    string x = "first line" + Environment.NewLine + "second line";
  • 文字列補間(C#6以降):

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

すべての場所で\ nを使用して、次のものを置き換えることもできます。

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

の値は実行時にしか使用できないため、これを文字列定数にすることはできませんEnvironment.NewLine


1
ええと、もちろん感謝しますが、Environment.NewLineを使用しないようにするつもりでした。私の質問は、「/ newline」リテラルがあるかどうかです。
キャプテンコミック

2
@キャプテン:なぜあなたは避けたいのEnvironment.NewLineですか?それとは正反対に、それを使用するのは良い習慣です
abatishchev 10/3

18
@abatishchev:いくつかの場所ではそれは良い習慣です。私の他の人ではそうではありません。プラットフォーム固有のものを使用することを本当に知っている必要があります。たとえば、ラインターミネータ自体を定義する必要があるネットワークプロトコルを使用している場合、これ良い考えではありません
Jon Skeet、2010年

1
@Captain Comic:最後の文で、文字エスケープにできない理由を説明しています。定数値ではないため、文字列定数のメタデータに含めることはできません。
Jon Skeet、2010年

1
ええ、私は両方のオプションの原因をためらっていたのかもしれません。1つはプラス演算子を使用し、もう1つはFormatメソッドを使用するのがかなりオーバーヘッドであり、 '\ newline'リテラルを注入するのが最も速い方法です。しかし、ジョンが言ったように、もし存在すればNewLineリテラルは動的でプラットフォームに依存していなければなりません。
キャプテンコミック、

33

Environment.NewLineを含むconst文字列が必要な場合は、次のようにすることができます。

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

編集

これはconst文字列にあるため、コンパイル時に行われ、コンパイラによる改行の解釈になります。この動作を説明するリファレンスが見つからないようですが、意図したとおりに機能することを証明できます。私はこのコードをWindowsとUbuntu(Monoを含む)の両方でコンパイルして逆アセンブルしました。結果は次のとおりです。

Windowsでの分解 Ubuntuで逆アセンブル

ご覧のとおり、Windowsでは改行は\ r \ nと解釈され、Ubuntuでは\ nと解釈されます


1
コンパイラーは、テキストの各行の間にEnvironment.NewLineを自動的に追加します。したがって、文字列は次のように解釈されます:「1行目」+ Environment.NewLine +「2行目」+ Environment.NewLine +「3行目」
Tal Jerome

3
+1文字列リテラルに改行を挿入するほとんど知られていない方法。指定した動作についての参照はありますか?それは本当にEnvironment.NewLineですか、それとも改行のコンパイラ定義ですか?
「絶望の

1
そこに挿入されるのは、コードエディタの改行文字ではないのですか?そのコードをWindowsのエディターにコピーアンドペーストすると、おそらく\ r \ nに変換されます。Unixライクなプラットフォームで同じことを行うと、おそらく\ nに変換されます。
Xiyng 2016年

これに気をつけて。CI / CDサーバー(Teamcity、サーバー側のチェックアウトなど)でコードをチェックアウトすると、CRLFがLFに変更され、文字列に改行はありません。
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
first + Environment.NewLine + secondより効率的で(IMO)読みやすいものを使用するのではなく、なぜこれを行うのですか?
Jon Skeet

@ジョン:本当にもっと効率的?私はそれString.Formatが一度に1つの文字列を生成するだろうと思いました(しかし、文化固有の連結などのために内部的には少し遅いです)一方、文字列連結-1結果+ 1一時的ですよね?
abatishchev 2010年

1
@abatishchev:コンパイラの改宗STR + STR + STRにString.Concatenate文字列リテラルをしている場合は、直接ただ一つの出力文字列を作成これは(IIRCは、連結はコンパイラで行われます。
リチャード・

@Richard:つまり"a"+b+"c"+d、パフォーマンスによる複数の1行の文字列連結(など)は単一のものと等しいですか?または単にに変換されString.Concatenate(a,b,c,d,etc)ますよね?
abatishchev 2010年

@abatishchev:それが私がstring.Formatコメントで提案しなかった理由です。コンパイラはを呼び出すため、文字列の連結では一時的な文字列は生成されませんstring.Concat(first, Environment.NewLine, second)
Jon Skeet

3

書式文字列にEnvironment.NewLineを配置するもう1つの方法。アイデアは、通常どおり文字列をフォーマットするだけでなく、テキストの{nl}をEnvironment.NewLineに置き換える文字列拡張メソッドを作成することです。

使用法

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

コード

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

注意

  1. ReSharperでパラメーターを強調表示するには、上記のメソッドに属性を追加します

    [StringFormatMethod( "format")]

  2. この実装は、単なるString.Formatよりも明らかに効率的ではありません。

  3. たぶん、この質問に興味がある人は、次の質問にも興味があるでしょう: C#での名前付き文字列フォーマット


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

それではない:

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:システムはすでに定義していますEnvironment.NewLine-他の回答を参照してください。
Richard

@リチャード:OPは、私が理解できる限り、インライン文字列リテラルを使用したいと考えています。つまり、const string
abatishchev


1

新しい.netバージョンでは、リテラルの前に$を使用して、次のように内部で変数を使用できます。

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

1
コンテキストの少しは悪くありません。
2016

1
これは質問に対する答えを提供しません。十分な評判得られたら、どの投稿にもコメントできます。代わりに、質問者からの説明を必要としない回答を提供してください。- レビューより
H. Pauwelyn

@ H.Pauwelynツ:フィードバックのためのThx。コンテキストを少し追加しました。私の観点から見ると、ソリューションは間違いなく質問に答えます。
DanielK 2016

0

改行文字列を定数として本当に必要な場合は、次のようにすることができます。

public readonly string myVar = Environment.NewLine;

C#のreadonlyキーワードのユーザーは、この変数を1回だけ割り当てることができることを意味します。そのドキュメントはここにあります。実行時まで値がわからない定数変数を宣言できます。


0

「パイソン風」の方が好き

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アプリケーションを使用している場合は、これを試すことができます。

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

私が質問を理解している場合:で"\r\n"以下の新しい行を取得するカップルtextbox。私の例はうまくいきました-

   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;

一般的な答えはs1 s2text box定義済みの型スタイルを使用することです。


-1

ここでは、Environment.NewLineは機能しません。

私は置く「< BR / >」の文字列で働いていたと。

例:

ltrYourLiteral.Text = "最初の行<。BR / >二行目。";

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.