2009-06-24 15 views
82

quiero para asegurarse de que _content no termina con un carácter de nueva línea:¿Cuál es la manera más fácil en C# para recortar una nueva línea de una cuerda?

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

pero el código anterior no funciona desde Recorte parece no tener un parámetro de sobrecarga para una colección de cadenas, sólo se caracteres.

¿Cuál es el delineador simple más simple para eliminar un Enivronment.Newline del final de una cuerda?

+3

por cierto, es probable que desee TrimEnd –

Respuesta

181

Lo siguiente funciona para mí.

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

o

sb.ToString().TrimEnd(Environment.NewLine.ToCharArray()); 
+0

muy conciso y se ocupa del problema \ n \ n, nice –

+1

Si bien el recorte de CUALQUIER combinación de caracteres que componen una nueva línea char (s) hace dirección subyacente problema y el espíritu de la pregunta, también deja un potencial para la funcionalidad no deseada en el sentido general. En un archivo de procesamiento de senario pude ver la necesidad de dejar el primer \ n intacto en una cadena de HeresALineForUnixToBeFedFromWindows \ n \ r \ n. Aunque es más prolijo, la respuesta de John Skeet es probablemente la mejor y la ReadLine de Scott Weinstein también es más "precisa" (aunque tal vez con un poco más de sobrecarga) –

+16

TrimEnd() ya está haciendo el trabajo sin ningún parámetro. http://msdn.microsoft.com/de-de/library/system.string.trimend(v=vs.110).aspx y http://msdn.microsoft.com/de-de/library/system.char .iswhitespace (v = vs.110) .aspx – Markus

5

¿Qué hay de

_content = sb.ToString().Trim(Environment.NewLine.ToCharArray()); 
+0

que no hace bastante * * lo mismo - es ll recortar "abc \ n \ n \ n \ n \ n" por ejemplo, incluso si Environment.NewLine es crlf –

+0

Declararlo como una característica :-) Me gusta la solución. –

13

¿Qué tal:

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

Es algo ineficaz si hay múltiples saltos de línea, pero que va a trabajar.

Alternativamente, si no le importa que el recorte (por ejemplo) o "\r\r\r\r""\n\n\n\n" en lugar de sólo "\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); 
} 
+0

Probablemente la solución más precisa, pero no de una sola línea :-) – bang

4
_content = sb.TrimEnd(Environment.NewLine.ToCharArray()); 

Esto, por supuesto quitar "\ r \ r \ r \ r" así como "\ n \ n \ n \ n" y otras combinaciones. Y en "entornos" donde NewLine es diferente de "\ n \ r" puede tener comportamientos extraños :-)

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

8

utilizar el marco. El método ReadLine() tiene que decir lo siguiente:

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

Así que el siguiente va a hacer el truco

_content = new StringReader(sb.ToString()).ReadLine(); 
+2

+1 inesperado. Elegante. – Askolein

+1

Elegante sí, pero no es fácil de entender para otros que leen esta línea. Necesita un comentario explicativo (en la misma línea, por supuesto, para seguir siendo de una sola línea :)) – gumo

2

¿Qué tal:

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

Que se tire todos los espacios en blanco desde el final de la cadena - sólo un problema si quería preservar espacios en blanco que no sean nuevos.

0

Un poco de falta de 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 nunca sea vista por su propio código. Es decir, mediante el uso de funciones nativas que eliminan la nueva línea. Muchos métodos de transmisión y archivo/io no incluirán la línea nueva si solicita salida línea por línea, aunque puede ser necesario ajustar algo en un System.IO.BufferedStream.

Cosas como System.IO.File.ReadAllLines se pueden utilizar en lugar de System.IO.File.ReadAllText mayor parte del tiempo, y ReadLine se pueden utilizar en lugar de Read una vez que se está trabajando con el tipo de corriente (por ejemplo BufferedStream).

-1

Tuve que eliminar las nuevas líneas en todo el texto. Así que utilicé:

  while (text.Contains(Environment.NewLine)) 
      { 
       text = text.Substring(0, text.Length - Environment.NewLine.Length); 
      } 
+0

Esto será un desastre si el texto contiene NewLine (s) que no está al final. –

15

.Trim() elimina \r\n para mí (utilizando .NET 4.0).

+0

Esto hace el trabajo. Menos código también. – JumpingJezza

0

Como Markus señaló que TrimEnd está haciendo el trabajo ahora. Necesitaba obtener alimentaciones de línea y espacio en blanco desde ambos extremos de cadena en el entorno Windows Phone 7.8. Después de haber perseguido diferentes opciones más complejas que mi problema se resolvió mediante el uso de Trim() solamente - pasaron 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 + "'"); 
    } 
Cuestiones relacionadas