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


155

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


9
В чем вопрос?
ибурлаков

Ответы:


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
@Captain: Почему вы хотите избежать Environment.NewLine? Наоборот, это хорошая практика
абатищев

18
@abatishchev: В некоторых местах это хорошая практика. В моих других это не так. Вы действительно должны знать, что вы хотите использовать платформу для конкретной. Например, не очень хорошая идея, если вы используете сетевой протокол, который должен сам определять терминаторы строки.
Джон Скит

1
@Captain Comic: мое последнее предложение объясняет, почему это не может быть буквальным выходом - вы не можете включить его в метаданные для строковой константы, потому что это не постоянное значение.
Джон Скит

1
Да, может быть, я неохотно вызывал оба варианта: один с использованием оператора плюс, а второй с использованием метода Format - это довольно трудоемкий процесс, где введение литерала '\ newline' было бы самым быстрым способом. Но, как сказал Джон, литерал NewLine, если он существует, должен быть динамическим и зависеть от платформы.
Капитан комиксов

33

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

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

РЕДАКТИРОВАТЬ

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

Разбирать на винде Разбирать на Ubuntu

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


1
Компилятор автоматически добавляет Environment.NewLine между каждой строкой в ​​тексте. Таким образом, строка интерпретируется как: «первая строка» + Environment.NewLine + «вторая строка» + Environment.NewLine + «третья строка»
Таль Джером

3
+1 Малоизвестный способ вставки новых строк в строковые литералы. Есть ли какая-либо ссылка на указанное вами поведение? Это действительно Environment.NewLine или определение новой строки компилятором?
Гримаса Отчаяния

1
Вы уверены, что это не символ новой строки редактора кода, который вставляется туда? Если вы скопируете этот код в редактор в Windows, он, вероятно, будет преобразован в \ r \ n. Сделайте то же самое на Unix-подобной платформе, и она, вероятно, будет преобразована в \ n.
Xiyng

Берегись с этим. Если вы извлекаете код на сервере 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который является более эффективным и (ИМО) легче читать?
Джон Скит

@Jon: Более эффективно, правда? Я думал, что String.Formatбудет производиться 1 строка за раз (но внутренне она немного медленная из-за конкатенации, специфичной для культуры, и т. Д.), В то время как конкатенация строк - 1 в результате + 1 временно, верно?
Абатищев

1
@abatishchev: компилятор преобразует str + str + str в String.Concatenate, что напрямую создает только одну выходную строку (IIRC, если строки являются литералами, конкатенация выполняется в компиляторе.
Ричард,

@Richard: т. Е. Многократная, но однострочная конкатенация строк ( "a"+b+"c"+dи т. Д.) По производительности равна одной? Или просто переоборудован в String.Concatenate(a,b,c,d,etc), верно?
Абатищев

@abatishchev: Вот почему я не предложил string.Formatв комментарии. Конкатенация строк не создаст никаких временных строк, потому что компилятор вызовет string.Concat(first, Environment.NewLine, second).
Джон Скит

3

Еще один способ удобного размещения 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);
    }

Заметка

  1. Если вы хотите, чтобы ReSharper выделил ваши параметры, добавьте атрибут к методу выше

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

  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
Е.

@Richard Environment.NewLine является статическим, а не постоянным

1

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

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

1
Немного контекста не было бы плохо.
Croxy

1
Это не дает ответа на вопрос. Как только у вас будет достаточно репутации, вы сможете комментировать любой пост ; вместо этого предоставьте ответы, которые не требуют разъяснений от автора . - Из обзора
H. Pauwelyn

@ H.Pauwelyn ツ: спасибо за отзыв. Я добавил немного контекста. С моей точки зрения решение определенно отвечает на вопрос.
DanielK

0

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

public readonly string myVar = Environment.NewLine;

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


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

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

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 s2 в text boxиспользовании определенного стиля стиля.


-1

Здесь Environment.NewLine не работает.

Я положил « < бр / > » в строке и работал.

Пример:

ltrYourLiteral.Text = "Первая строка. <br /> Вторая строка.";

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.