web-dev-qa-db-ja.com

文字列リテラルに改行を挿入する方法

.NETでは\r\nの両方の文字列リテラルを提供できますが、Environment.NewLine static propertyのような "new line"特殊文字のようなものを挿入する方法はありますか?

139
Captain Comic

簡単な選択肢は次のとおりです。

  • 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の値は実行時にのみ利用可能になるため、これを文字列定数にすることはできません。

287
Jon Skeet

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

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

編集

これはconst文字列の中にあるので、コンパイル時に行われるので、コンパイラによる改行の解釈になります。私はこの振る舞いを説明する参照を見つけることができないようですが、私はそれが意図した通りに働くことを証明することができます。私はWindowsとUbuntu(Mono付き)の両方でこのコードをコンパイルしてから逆アセンブルしましたが、これらが結果です。

Disassemble on WindowsDisassemble on Ubuntu

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

29
Tal Jerome
var sb = new StringBuilder();
sb.Append(first);
sb.AppendLine(); // which is equal to Append(Environment.NewLine);
sb.Append(second);
return sb.ToString();
12
abatishchev

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に自分のパラメータを強調表示させたい場合は、上記のメソッドにattributeを追加してください。

    [StringFormatMethod( "format")]

  2. この実装はString.Formatよりも明らかに効率が悪いです。

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

3
MajesticRa
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>";
2
Hakkı Eser

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

var x = $"Line 1{Environment.NewLine}Line 2{Environment.NewLine}Line 3";
1
DanielK
static class MyClass
{
   public const string NewLine="\n";
}

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

改行文字列を本当に定数として使用したい場合は、次のようにします。

public readonly string myVar = Environment.NewLine;

C#でreadonlyキーワードを使用するということは、この変数は一度だけ割り当てることができるということです。あなたはそれについてのドキュメントを見つけることができます こちら 。実行時まで値がわからない定数変数を宣言できます。

0
wizard07KSU

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
Tejas Bagade

私が質問を理解したならば: "\ r\n"をカップルして、その新しい行をテキストボックスの下に入れてください。私の例はうまくいった -

ストリングs1 = comboBox1.Text; // s1はボックス1などに割り当てられた変数です。string s2 = comboBox2.Text;

文字列both = s1 + "\ r\n" + s2; textBox1.Text = both;典型的な答えは、定義済みの書体を使ったテキストボックスの中のs1 s2です。

0
Charles F

私はもっ​​と "Pythonic way"が好きです

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
percebus