¿Cómo insertar nueva línea en literal de cadena?

155

En .NET puedo proporcionar ambos \ro \nliterales de cadena, pero hay una manera de insertar algo como un carácter especial de "nueva línea" como Environment.NewLinepropiedad estática.

Captain Comic
fuente
9
¿Cuál es la pregunta?
iburlakov el

Respuestas:

319

Bueno, las opciones simples son:

  • string.Format:

    string x = string.Format("first line{0}second line", Environment.NewLine);
  • Concatenación de cadenas:

    string x = "first line" + Environment.NewLine + "second line";
  • Interpolación de cadenas (en C # 6 y superior):

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

También puede usar \ n en todas partes y reemplazar:

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

Tenga en cuenta que no puede convertir esto en una cadena constante , porque el valor de Environment.NewLinesolo estará disponible en el momento de la ejecución.

Jon Skeet
fuente
1
Bueno, gracias, por supuesto, pero me refería a evitar usar Environment.NewLine, mi pregunta era si hay literal '/ newline'.
Captain Comic el
2
@ Capitán: ¿Por qué quieres evitarlo Environment.NewLine? Por el contrario, es una buena práctica usarlo
abatishchev el
18
@abatishchev: En algunos lugares es una buena práctica. En mis otros no lo es. Realmente necesita saber que desea utilizar la plataforma específica. Por ejemplo, no es una buena idea si está utilizando un protocolo de red que debería definir los terminadores de línea en sí.
Jon Skeet el
1
@Captain cómica: Mi última frase explica por qué no puede ser un escape literal - no se puede incluirlo en los metadatos para una constante de cadena, porque es no un valor constante.
Jon Skeet el
1
Sí, puede que sea reacio porque ambas opciones: una que usa el operador más y la segunda que usa el método de formato son bastante costosas, donde inyectar literalmente '\ newline' sería la forma más rápida. Pero como dijo Jon NewLine, literal si existiera, tendría que ser dinámico y dependiente de la plataforma.
Captain Comic el
33

Si desea una cadena constante que contenga Environment.NewLine, puede hacer algo como esto:

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

EDITAR

Como esto está en una cadena constante, se realiza en tiempo de compilación, por lo tanto, es la interpretación del compilador de una nueva línea. Parece que no puedo encontrar una referencia que explique este comportamiento, pero puedo demostrar que funciona según lo previsto. Compilé este código en Windows y Ubuntu (con Mono), luego lo desarme y estos son los resultados:

Desmontar en Windows Desmontar en Ubuntu

Como puede ver, en Windows las nuevas líneas se interpretan como \ r \ n y en Ubuntu como \ n

Tal Jerome
fuente
1
El compilador agrega automáticamente un Environment.NewLine entre cada línea del texto. Por lo tanto, la cadena se interpreta como: "primera línea" + Medio ambiente.Nueva línea + "segunda línea" + Medio ambiente.Nueva línea + "tercera línea"
Tal Jerome
3
+1 Forma poco conocida de insertar nuevas líneas en literales de cadena. ¿Hay alguna referencia para el comportamiento que especifique? ¿Es realmente Environment.NewLine o es la definición del compilador de una nueva línea?
Mueca de desesperación
1
¿Estás seguro de que no es el carácter de nueva línea del editor de código el que se inserta allí? Si copia y pega ese código en un editor en Windows, probablemente se convertirá a \ r \ n. Haga lo mismo en una plataforma tipo Unix y probablemente se convertirá a \ n en su lugar.
Xiyng
Cuidado con esto. Si extrae el código en el servidor CI / CD (como Teamcity, lado del servidor) cambiará CRLF a LF y no habrá nuevas líneas en la cadena.
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();
abatishchev
fuente
2
¿Por qué haría esto en lugar de utilizar first + Environment.NewLine + secondcuál es más eficiente y (IMO) más fácil de leer?
Jon Skeet el
@ Jon: ¿Más eficiente, de verdad? Pensé que String.Formatproduciría 1 cadena a la vez (pero internamente es un poco lento debido a las concatenaciones específicas de la cultura, etc.), mientras que la concatenación de cadenas - 1 resulta + 1 temporal, ¿verdad?
abatishchev 03 de
1
@abatishchev: el compilador convierte str + str + str en String.Concatenate, que construye directamente una sola cadena de salida (IIRC, si las cadenas son literales, la concatenación se realiza en el compilador.
Richard
@ Richard: es decir, la concatenación de cadenas múltiples pero de una línea ( "a"+b+"c"+d, etc.) por rendimiento es igual a una sola. O simplemente convertido a String.Concatenate(a,b,c,d,etc), ¿verdad?
abatishchev 03 de
@abatishchev: Por eso no sugerí string.Formaten el comentario. La concatenación de cadenas no producirá ninguna cadena temporal, porque el compilador llamará string.Concat(first, Environment.NewLine, second).
Jon Skeet el
3

Una forma más de ubicación conveniente de Environment.NewLine en formato de cadena. La idea es crear un método de extensión de cadena que formatee la cadena como de costumbre, pero que también reemplace {nl} en texto con Environment.NewLine

Uso

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

Código

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

Nota

  1. Si desea que ReSharper resalte sus parámetros, agregue un atributo al método anterior

    [StringFormatMethod ("formato")]

  2. Obviamente, esta implementación es menos eficiente que solo String.

  3. Tal vez uno, que esté interesado en esta pregunta, también esté interesado en la siguiente: formato de cadena con nombre en C #

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

eso no es:

string myText =
@"<div class=\"firstLine\"></div>
  <div class=\"secondLine\"></div>
  <div class=\"thirdLine\"></div>";
Hakkı Eser
fuente
1
static class MyClass
{
   public const string NewLine="\n";
}

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

fuente
3
-1: El sistema ya define Environment.NewLine- ver las otras respuestas.
Richard
@ Richard: OP, por lo que pude entender, quiere usar literal de cadena en línea, es decirconst string
abatishchev el
@ Richard Environment.NewLine es estático, no constante
1

las versiones más recientes de .net le permiten usar $ delante del literal que le permite usar variables dentro de la siguiente manera:

var x = $"Line 1{Environment.NewLine}Line 2{Environment.NewLine}Line 3";
DanielK
fuente
1
Un poco de contexto no sería malo.
croxy
1
Esto no proporciona una respuesta a la pregunta. Una vez que tenga suficiente reputación , podrá comentar cualquier publicación ; en su lugar, proporcione respuestas que no requieran una aclaración del autor de la pregunta . - De la opinión
H. Pauwelyn
@ H.Pauwelyn ツ: Gracias por los comentarios. Agregué un poco de contexto. Desde mi punto de vista, la solución definitivamente responde a la pregunta.
DanielK
0

Si realmente quieres la cadena New Line como una constante, entonces puedes hacer esto:

public readonly string myVar = Environment.NewLine;

El usuario de la palabra clave de solo lectura en C # significa que esta variable solo se puede asignar una vez. Puede encontrar la documentación aquí . Permite la declaración de una variable constante cuyo valor no se conoce hasta el momento de la ejecución.

wizard07KSU
fuente
0

Me gusta más el "camino pitónico"

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);
Perbus
fuente
0

Si está trabajando con una aplicación web, puede probar esto.

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 />")
Tejas Bagade
fuente
0

Si entiendo la pregunta: Pareja "\r\n"para obtener esa nueva línea a continuación en a textbox. Mi ejemplo funcionó:

   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;

Una respuesta típica podría estar s1 s2 en el text boxuso del estilo de tipo definido.

Charles F
fuente
-1

Aquí, Environment.NewLine no funciona.

Pongo un " < br / > " en una cadena y trabajado.

Ex:

ltrYourLiteral.Text = "Primera línea <. br / > Segunda Línea.";

Fábio
fuente