Qual é a maneira mais fácil em C # de cortar uma nova linha de uma string?

115

Quero ter certeza de que _content não termina com um caractere NewLine:

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

mas o código acima não funciona, pois Trim parece não ter um parâmetro sobrecarregado para uma coleção de strings, apenas caracteres.

Qual é a linha mais simples para remover um Enivronment.Newline do final de uma string?

Edward Tanguay
fonte
4
btw, você provavelmente quer TrimEnd
Marc Gravell

Respostas:

260

O seguinte funciona para mim.

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

ou

sb.ToString().TrimEnd( Environment.NewLine.ToCharArray());
Simon Wilson
fonte
muito conciso e lida com o problema \ r \ n, legal
Edward Tanguay
1
Embora aparar QUALQUER combinação de caracteres que compõe uma nova linha, resolva o problema subjacente e o espírito da questão, também deixa um potencial para funcionalidade indesejada no sentido geral. Em um cenário de processamento de arquivo, pude ver a necessidade de deixar o primeiro \ n intacto em uma string de HeresALineForUnixToBeFedFromWindows \ n \ r \ n. Embora mais prolixa, a resposta de John Skeet é provavelmente a melhor e a ReadLine de Scott Weinstein também é mais "precisa" (embora talvez com um pouco mais de overhead)
b_levitt
26
TrimEnd () já está fazendo o trabalho sem nenhum parâmetro! msdn.microsoft.com/de-de/library/… e msdn.microsoft.com/de-de/library/…
Markus
3
@Markus Obrigado. Achei isso porque não quero esse comportamento, mas estava experimentando. Tive a impressão de que \ n não era um espaço em branco, mas é e .TrimEnd e .Trim apagam todos os caracteres de espaço em branco nativamente
David Carrigan
39

.Trim()remove \r\npara mim (usando .NET 4.0).

xr280xr
fonte
14

E se:

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

É um tanto ineficiente se houver várias novas linhas, mas funcionará.

Alternativamente, se você não se importar em cortar (digamos) "\r\r\r\r"ou em "\n\n\n\n"vez de apenas "\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
fonte
1
Provavelmente a solução mais precisa, mas não de uma linha :-)
bang
9

Use o Framework. O método ReadLine () tem o seguinte a dizer:

Uma linha é definida como uma sequência de caracteres seguida por uma alimentação de linha ("\ n"), um retorno de carro ("\ r") ou um retorno de carro imediatamente seguido por uma alimentação de linha ("\ r \ n"). A string retornada não contém o retorno de carro de terminação ou a alimentação de linha.

Então, o seguinte fará o truque

_content = new StringReader(sb.ToString()).ReadLine();
Scott Weinstein
fonte
1
Elegante, sim, mas não é fácil de entender para outras pessoas que estejam lendo esta linha. Precisa de um comentário explicativo (na mesma linha, é claro, para permanecer
unilateral
1
Não funciona quando a string tem mais de uma linha e você deseja remover apenas a última linha vazia.
Florian Berger
6

A respeito

_content = sb.ToString().Trim(Environment.NewLine.ToCharArray());
pesado
fonte
Isso não faz exatamente a mesma coisa - cortará "abc \ n \ n \ n \ n \ n" por exemplo, mesmo se Environment.NewLine for crlf
Marc Gravell
1
Declare-o como uma característica :-) Gosto da solução.
Stefan Steinegger
5
_content = sb.TrimEnd(Environment.NewLine.ToCharArray());

Naturalmente, isso removerá "\ r \ r \ r \ r", bem como "\ n \ n \ n \ n" e outras combinações. E em "ambientes" onde NewLine é diferente de "\ n \ r" você pode ter alguns comportamentos estranhos :-)

Mas se você consegue conviver com isso, acredito que essa é a maneira mais eficaz de remover novos caracteres de linha no final de uma string.

estrondo
fonte
3

Que tal apenas:

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

Isso puxará todos os caracteres de espaço em branco do final da string - um problema apenas se você quiser preservar os espaços em branco que não sejam de nova linha.

Richard Dunlap
fonte
1

Um pouco sem resposta, mas a maneira mais fácil de cortar uma nova linha de uma string é não ter a nova linha na string em primeiro lugar, garantindo que ela nunca seja vista por seu próprio código. Ou seja, usando funções nativas que removem a nova linha. Muitos métodos stream e file / io não incluirão a nova linha se você solicitar a saída linha por linha, embora possa ser necessário envolver algo em umSystem.IO.BufferedStream .

Coisas como System.IO.File.ReadAllLinespodem ser usadas no lugar na System.IO.File.ReadAllTextmaior parte do tempo e ReadLinepodem ser usadas em vez de Readquando você estiver trabalhando com o tipo certo de fluxo (por exemplo BufferedStream).

Brian
fonte
0

Como Markus apontou, TrimEnd está fazendo o trabalho agora. Eu precisava obter avanços de linha e espaço em branco de ambas as extremidades da string no ambiente do Windows Phone 7.8. Depois de ter perseguido diferentes opções mais complexas, meu problema foi resolvido usando apenas Trim () - passou bem nos seguintes testes

   [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
fonte
-2

Tive que remover as novas linhas de todo o texto. Então eu usei:

            while (text.Contains(Environment.NewLine))
            {
                text = text.Substring(0, text.Length - Environment.NewLine.Length);
            }
Ekaterina
fonte
1
Isso será um desastre se o texto contiver NewLine (s) que não estão no final.
Stefan Bergfeldt