Как вставить новую строку в строковый литерал?

В .NET я могу предоставить строковые литералы \r или \n, но есть способ вставить что-то вроде специального символа "новая строка", такого как статическое свойство Environment.NewLine?

Ответ 1

Ну, простые варианты:

  • string.Format:

    string x = string.Format("first line{0}second line", Environment.NewLine);
    
  • Конкатенация строк:

    string x = "first line" + Environment.NewLine + "second line";
    
  • Строковая интерполяция (в С# 6 и выше):

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

Вы также можете использовать \n всюду и заменить:

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

Обратите внимание, что вы не можете сделать это строковой константой, потому что значение Environment.NewLine будет доступно только во время выполнения.

Ответ 2

Если вам нужна строка const, содержащая Environment.NewLine, вы можете сделать что-то вроде этого:

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

ИЗМЕНИТЬ

Так как это в строке const, это выполняется во время компиляции, поэтому это интерпретация компилятора новой строки. Кажется, я не могу найти ссылку, объясняющую это поведение, но могу доказать, что она работает по назначению. Я скомпилировал этот код как на Windows, так и на Ubuntu (с помощью Mono), затем разобрал и это результаты:

Disassemble on WindowsDisassemble on Ubuntu

Как вы можете видеть, в Windows новые строки интерпретируются как \r\n и на Ubuntu как\n

Ответ 3

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

Ответ 4

Еще один способ удобного размещения Environment.NewLine в строке формата. Идея состоит в том, чтобы создать метод расширения строк, который форматирует строку как обычно, но также заменяет {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);
    }

Примечание

  • Если вы хотите, чтобы ReSharper выделил ваши параметры, добавьте атрибут выше описанного метода

    [StringFormatMethod ( "Формат" )]

  • Эта реализация явно менее эффективна, чем просто String.Format

  • Возможно, тот, кого интересует этот вопрос, будет интересовать и следующий вопрос: Именованное форматирование строк в С#

Ответ 5

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

Ответ 6

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

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

Ответ 7

Если вы действительно хотите, чтобы строка New Line была константой, вы можете сделать это:

public readonly string myVar = Environment.NewLine;

Пользователь ключевого слова readonly в С# означает, что эта переменная может быть назначена только один раз. Здесь вы можете найти документацию здесь. Он позволяет объявлять постоянную переменную, значение которой неизвестно до времени выполнения.

Ответ 8

Мне больше нравится "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);

Ответ 9

Если я понимаю вопрос: Пара "\ r\n", чтобы получить эту новую строку ниже в текстовом поле. Мой пример работал -

string s1 = comboBox1.Text;//s1 - это переменная, назначенная в поле 1, и т.д.  string s2 = comboBox2.Text;

string both = s1 + "\ r\n" + s2;  textBox1.Text = both; Типичным ответом может быть s1                         s2 в текстовом поле, используя стиль определенного типа.

Ответ 10

Новые версии .net позволяют использовать $перед литералом, который позволяет использовать переменные внутри, как показано ниже:

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

Ответ 11

Если вы работаете с веб-приложением, вы можете попробовать это.

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

Ответ 12

Вы можете вставить в строку тег HTML Break Line. Когда браузер отобразит его, у вас будет новая строка.

string variable = "Line one Content" + "<br>" + "Line two Content";

Это будет отображаться как:

Line one Content
Line two Content

Я не нашел браузер, где это не работает.