¿Cuál es la forma más fácil en C # de recortar una nueva línea de una cadena?

115

Quiero asegurarme de que _content no termine con un carácter NewLine:

_content = sb.ToString().Trim(new char[] { Environment.NewLine });

pero el código anterior no funciona ya que Trim parece no tener un parámetro sobrecargado para una colección de cadenas, solo caracteres.

¿Cuál es la frase más simple para eliminar un Enivronment.Newline del final de una cadena?

Edward Tanguay
fuente
4
por cierto, probablemente quieras TrimEnd
Marc Gravell

Respuestas:

260

Lo siguiente funciona para mí.

sb.ToString().TrimEnd( '\r', '\n' );

o

sb.ToString().TrimEnd( Environment.NewLine.ToCharArray());
Simon Wilson
fuente
muy conciso y trata el problema \ r \ n, agradable
Edward Tanguay
1
Si bien recortar CUALQUIER combinación de caracteres que componen un nuevo carácter de línea aborda el problema subyacente y el espíritu de la pregunta, también deja un potencial de funcionalidad no deseada en el sentido general. En un senario de procesamiento de archivos, pude ver la necesidad de dejar el primer \ n intacto en una cadena de HeresALineForUnixToBeFedFromWindows \ n \ r \ n. Si bien es más detallado, la respuesta de John Skeet es probablemente la mejor y ReadLine de Scott Weinstein también es más "precisa" (aunque quizás con un poco más de sobrecarga)
b_levitt
26
¡TrimEnd () ya está haciendo el trabajo sin ningún parámetro! msdn.microsoft.com/de-de/library/… y msdn.microsoft.com/de-de/library/…
Markus
3
@Markus Gracias. Encontré esto porque no quiero este comportamiento pero lo estaba experimentando. Tenía la impresión de que \ n no era un espacio en blanco, pero sí y .TrimEnd y .Trim borran todos los caracteres de espacios en blanco de forma nativa
David Carrigan
39

.Trim()elimina \r\npara mí (usando .NET 4.0).

xr280xr
fuente
14

Qué tal si:

public static string TrimNewLines(string text)
{
    while (text.EndsWith(Environment.NewLine))
    {
        text = text.Substring(0, text.Length - Environment.NewLine.Length);
    }
    return text;
}

Es algo ineficiente si hay varias líneas nuevas, pero funcionará.

Alternativamente, si no le importa recortar (digamos) "\r\r\r\r"o en "\n\n\n\n"lugar de simplemente "\r\n\r\n\r\n":

// No need to create a new array each time
private static readonly char[] NewLineChars = Environment.NewLine.ToCharArray();

public static string TrimNewLines(string text)
{
    return text.TrimEnd(NewLineChars);
}
Jon Skeet
fuente
1
Probablemente la solución más precisa, pero no de una sola línea :-)
bang
9

Utilice el Framework. El método ReadLine () tiene lo siguiente para decir:

Una línea se define como una secuencia de caracteres seguida de un salto de línea ("\ n"), un retorno de carro ("\ r") o un retorno de carro seguido inmediatamente por un salto de línea ("\ r \ n"). La cadena que se devuelve no contiene el retorno de carro de terminación ni el salto de línea.

Entonces lo siguiente hará el truco

_content = new StringReader(sb.ToString()).ReadLine();
Scott Weinstein
fuente
1
Elegante, sí, pero no fácil de entender para los que lean esta línea. Necesita un comentario explicativo (en la misma línea, por supuesto, para seguir siendo una sola línea :))
gumo
1
No lo hace cuando la cadena tiene más de una línea y solo desea eliminar la última línea vacía.
Florian Berger
6

Qué pasa

_content = sb.ToString().Trim(Environment.NewLine.ToCharArray());
pesado
fuente
Eso no hace exactamente lo mismo: recortará "abc \ n \ n \ n \ n \ n", por ejemplo, incluso si Environment.NewLine es crlf
Marc Gravell
1
Declararlo como una característica :-) Me gusta la solución.
Stefan Steinegger
5
_content = sb.TrimEnd(Environment.NewLine.ToCharArray());

Esto, por supuesto, eliminará "\ r \ r \ r \ r", así como "\ n \ n \ n \ n" y otras combinaciones. Y en "entornos" donde NewLine es diferente a "\ n \ r", es posible que obtenga algunos comportamientos extraños :-)

Pero si puede vivir con esto, entonces creo que esta es la forma más efectiva de eliminar caracteres de nueva línea al final de una cadena.

explosión
fuente
3

¿Qué tal solo:

string text = sb.ToString().TrimEnd(null)

Eso extraerá todos los caracteres de espacio en blanco del final de la cadena, solo un problema si desea conservar los espacios en blanco que no son de nueva línea.

Richard Dunlap
fuente
1

Algo que no es una respuesta, pero la forma más fácil de recortar una nueva línea de una cadena es no tener la nueva línea en la cadena en primer lugar, asegurándose de que su propio código nunca la vea. Es decir, utilizando funciones nativas que eliminan la nueva línea. Muchos métodos de flujo y archivo / io no incluirán la nueva línea si solicita la salida línea por línea, aunque puede ser necesario ajustar algo en un archivo System.IO.BufferedStream.

Cosas como System.IO.File.ReadAllLinesse pueden usar en lugar de la System.IO.File.ReadAllTextmayor parte del tiempo y ReadLinese pueden usar en lugar de Readuna vez que esté trabajando con el tipo correcto de flujo (por ejemplo BufferedStream).

Brian
fuente
0

Como Markus señaló, TrimEnd está haciendo el trabajo ahora. Necesitaba obtener avances de línea y espacios en blanco de ambos extremos de la cadena en el entorno de Windows Phone 7.8. Después de haber perseguido diferentes opciones más complejas, mi problema se resolvió usando solo Trim (): pasó las siguientes pruebas muy bien

   [TestMethod]
    [Description("TrimNewLines tests")]
    public void Test_TrimNewLines()
    {
        Test_TrimNewLines_runTest("\n\r     testi    \n\r", "testi");
        Test_TrimNewLines_runTest("\r     testi    \r", "testi");
        Test_TrimNewLines_runTest("\n     testi    \n", "testi");
        Test_TrimNewLines_runTest("\r\r\r\r\n\r     testi   \r\r\r\r \n\r", "testi");
        Test_TrimNewLines_runTest("\n\r  \n\n\n\n   testi äål.,    \n\r", "testi äål.,");
        Test_TrimNewLines_runTest("\n\n\n\n     testi  ja testi  \n\r\n\n\n\n", "testi  ja testi");
        Test_TrimNewLines_runTest("", "");
        Test_TrimNewLines_runTest("\n\r\n\n\r\n", "");
        Test_TrimNewLines_runTest("\n\r \n\n \n\n", "");
    }

    private static void Test_TrimNewLines_runTest(string _before, string _expected)
    {
        string _response = _before.Trim();
        Assert.IsTrue(_expected == _response, "string '" + _before + "' was translated to '" + _response + "' - should have been '" + _expected + "'");
    }
juhariis
fuente
-2

Tuve que eliminar las nuevas líneas en todo el texto. Entonces usé:

            while (text.Contains(Environment.NewLine))
            {
                text = text.Substring(0, text.Length - Environment.NewLine.Length);
            }
Ekaterina
fuente
1
Esto será un desastre si el texto contiene NewLine (s) que no está al final.
Stefan Bergfeldt