it-swarm.com.ru

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

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

134
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 будет доступно только во время выполнения.

274
Jon Skeet

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

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

Правка

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

Disassemble on WindowsDisassemble on Ubuntu

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

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

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

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
static class MyClass
{
   public const string NewLine="\n";
}

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

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

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

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

public readonly string myVar = Environment.NewLine;

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

0
wizard07KSU

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

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 и т. д строка s2 = comboBox2.Text;

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

0
Charles F

Мне больше нравится "Питонский путь"

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