如何在字符串文字中插入换行符?


155

在.NET中,我可以提供两个\r\n字符串常量,但插入像“新线”的特殊字符类似的方式Environment.NewLine静态属性?


9
有什么问题
iburlakov

Answers:


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 2010年

18
@abatishchev:在某些地方,这是一个好习惯。在我其他人中不是。您确实需要知道要使用特定于平台的平台。例如,如果您使用的是网络协议,而网络协议本身应定义线路终端,则不是一个好主意。
乔恩·斯基特

1
@Captain Comic:我的最后一句话解释了为什么它不能是字面转义-您不能在字符串常量的元数据中包含它,因为它不是常量值。
乔恩·斯基特

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。因此该字符串被解释为:“第一行” + Environment.NewLine +“第二行” + Environment.NewLine +“第三行”
Tal Jerome

3
+1在字符串文字中插入换行符的鲜为人知的方法。您指定的行为是否有参考?确实是Environment.NewLine还是换行符的编译器定义?
绝望的鬼脸

1
您确定不是在此处插入代码编辑器的换行符吗?如果将代码复制粘贴到Windows上的编辑器中,则可能会将其转换为\ r \ n。在类似Unix的平台上执行相同的操作,它可能会转换为\ n。
杭州,2016年

注意这一点。如果您在CI / CD服务器上签出代码(例如Teamcity,服务器端签出),它将把CRLF更改为LF,并且字符串中不会出现新行。
Leszek P '18年

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:更有效率,真的吗?我以为String.Format会一次产生1个字符串(但由于文化特定的串联等原因,内部会有点慢),而字符串串联-1个结果+ 1个临时字符串,对吗?
abatishchev,2010年

1
@abatishchev:编译器将str + str + str转换为String.Concatenate,直接构建一个输出字符串(IIRC,如果字符串是文字,则级联在编译器中完成。)
理查德(Richard)2010年

@Richard:即"a"+b+"c"+d按性能进行的多个但单行字符串连接(等)等于一个吗?或者只是转换为String.Concatenate(a,b,c,d,etc),对吗?
abatishchev

@abatishchev:这就是为什么我没有string.Format在评论中建议的原因。字符串串联不会产生任何临时字符串,因为编译器将调用string.Concat(first, Environment.NewLine, second)
乔恩·斯基特

3

一种方便的将Environment.NewLine放置在格式字符串中的方法。这个想法是创建一个字符串扩展方法,该方法可以照常格式化字符串,但也可以使用Environment.NewLine替换文本中的{nl}

用法

   " 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-请参阅其他答案。
理查德

@理查德:据我所知,OP想使用内联字符串文字,即const string
abatishchev 2010年

@Richard Environment.NewLine是静态而不是const

1

较新的.net版本允许您在文字前面使用$,从而可以使用如下所示的变量:

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

1
一点上下文也不错。
croxy

1
这不能为问题提供答案。一旦您拥有足够的声誉,您就可以在任何帖子中发表评论;而是提供不需要问询者澄清的答案。- 评分
H. Pauwelyn

@ H.Pauwelynツ:感谢您的反馈。我添加了一些上下文。从我的角度来看,解决方案肯定可以回答这个问题。
DanielK '16

0

如果您确实希望将换行符字符串作为常量,则可以执行以下操作:

public readonly string myVar = Environment.NewLine;

C#中readonly关键字的用户意味着该变量只能分配一次。您可以在此处找到文档。它允许声明一个常量变量,其值直到执行时才知道。


0

我更喜欢“ 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);

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 / >第二行。”;

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.