web-dev-qa-db-fra.com

Comment insérer une nouvelle ligne dans un littéral de chaîne?

Dans .NET, je peux fournir les littéraux de chaîne \r ou \n, mais il existe un moyen d'insérer .__ quelque chose comme un caractère spécial "nouvelle ligne" comme la propriété statique Environment.NewLine?

134
Captain Comic

Eh bien, les options simples sont:

  • string.Format:

    string x = string.Format("first line{0}second line", Environment.NewLine);
    
  • Concaténation de chaînes:

    string x = "first line" + Environment.NewLine + "second line";
    
  • Interpolation de chaîne (en C # 6 et supérieur):

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

Vous pouvez également utiliser\n partout et remplacer:

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

Notez que vous ne pouvez pas en faire une chaîne constante , car la valeur de Environment.NewLine sera uniquement disponible au moment de l’exécution.

274
Jon Skeet

Si vous voulez une chaîne de const contenant Environment.NewLine, vous pouvez faire quelque chose comme ceci:

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

MODIFIER

Puisqu'il s'agit d'une chaîne const, cela se fait au moment de la compilation, c'est donc l'interprétation par le compilateur d'une nouvelle ligne. Je n'arrive pas à trouver une référence expliquant ce comportement, mais je peux prouver que cela fonctionne comme prévu. J'ai compilé ce code sous Windows et Ubuntu (avec Mono), puis désassemblé et voici les résultats:

Disassemble on WindowsDisassemble on Ubuntu

Comme vous pouvez le constater, dans Windows, les nouvelles lignes sont interprétées comme\r\n et sous Ubuntu comme\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

Une autre façon de placer facilement Environment.NewLine dans le format chaîne . L’idée est de créer une méthode d’extension de chaîne qui formate la chaîne comme d’habitude, mais remplace également {nl} dans le texte par Environment.NewLine

Usage

   " X={0} {nl} Y={1}{nl} X+Y={2}".FormatIt(1, 2, 1+2);
   gives:
    X=1
    Y=2
    X+Y=3

Code

    ///<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);
    }

Remarque

  1. Si vous souhaitez que ReSharper mette en surbrillance vos paramètres, ajoutez un attribut à la méthode ci-dessus.

    [StringFormatMethod ("format")]

  2. Cette implémentation est évidemment moins efficace que juste String.Format 

  3. Peut-être un de ceux qui s’intéresseraient à cette question s’intéresserait-il également à la question suivante: Formatage de chaîne nommée en C #

3
MajesticRa
string myText =
    @"<div class=""firstLine""></div>
      <div class=""secondLine""></div>
      <div class=""thirdLine""></div>";

ce n'est pas ça:

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

les nouvelles versions .net vous permettent d'utiliser $ devant le littéral, ce qui vous permet d'utiliser des variables à l'intérieur comme suit:

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

Si vous voulez vraiment que la chaîne New Line soit une constante, procédez comme suit:

public readonly string myVar = Environment.NewLine;

L'utilisateur du mot clé readonly en C # signifie que cette variable ne peut être affectée qu'une seule fois. Vous pouvez trouver la documentation à ce sujet ici . Il permet la déclaration d'une variable constante dont la valeur n'est pas connue avant le temps d'exécution.

0
wizard07KSU

Si vous travaillez avec une application Web, vous pouvez essayer ceci.

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

Si je comprends la question: Couple "\ r\n" pour obtenir cette nouvelle ligne ci-dessous dans une zone de texte. Mon exemple a fonctionné -

chaîne s1 = comboBox1.Text; // s1 est la variable affectée à la case 1, etc. . chaîne s2 = comboBox2.Text;

chaîne les deux = s1 + "\ r\n" + s2; textBox1.Text = both; Une réponse typique pourrait être s1 s2 dans la zone de texte en utilisant un style défini.

0
Charles F

J'aime plus la "façon pythonique"

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