Quelle est la manière la plus simple en C # de couper une nouvelle ligne d'une chaîne?

115

Je veux m'assurer que _content ne se termine pas par un caractère NewLine:

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

mais le code ci - dessus ne fonctionne pas car Trim ne semble pas avoir de paramètre surchargé pour une collection de chaînes, uniquement des caractères.

Quel est le one-liner le plus simple pour retirer un Enivronment.Newline de la fin d'une chaîne?

Edward Tanguay
la source
4
btw, vous voulez probablement TrimEnd
Marc Gravell

Réponses:

260

Ce qui suit fonctionne pour moi.

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

ou

sb.ToString().TrimEnd( Environment.NewLine.ToCharArray());
Simon Wilson
la source
très concis et traite du problème \ r \ n, sympa
Edward Tanguay
1
Bien que le découpage de TOUTE combinaison de caractères qui composent un ou plusieurs caractères de nouvelle ligne résout le problème sous-jacent et l'esprit de la question, cela laisse également un potentiel de fonctionnalités indésirables au sens général. Dans un senario de traitement de fichiers, je pouvais voir la nécessité de laisser le premier \ n intact dans une chaîne de HeresALineForUnixToBeFedFromWindows \ n \ r \ n. Bien que plus verbeuse, la réponse de John Skeet est probablement la meilleure et la ReadLine de Scott Weinstein est également plus "précise" (bien qu'avec peut-être un peu plus de frais généraux)
b_levitt
26
TrimEnd () fait déjà le Job sans aucun paramètre! msdn.microsoft.com/de-de/library/… et msdn.microsoft.com/de-de/library/…
Markus
3
@Markus Merci, j'ai trouvé cela parce que je ne veux pas de ce comportement mais je le vivais. J'avais l'impression \ n n'était pas un espace blanc, mais c'est le cas et .TrimEnd et .Trim effacent tous les espaces blancs en mode natif
David Carrigan
39

.Trim()supprime \r\npour moi (en utilisant .NET 4.0).

xr280xr
la source
14

Que diriez-vous:

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

C'est quelque peu inefficace s'il y a plusieurs nouvelles lignes, mais cela fonctionnera.

Sinon, si cela ne vous dérange pas de couper (par exemple) "\r\r\r\r"ou "\n\n\n\n"plutôt que de simplement "\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
la source
1
Probablement la solution la plus précise, mais pas une seule ligne :-)
bang
9

Utilisez le Framework. La méthode ReadLine () a ce qui suit à dire:

Une ligne est définie comme une séquence de caractères suivie d'un saut de ligne ("\ n"), d'un retour chariot ("\ r") ou d'un retour chariot immédiatement suivi d'un saut de ligne ("\ r \ n"). La chaîne renvoyée ne contient pas le retour chariot de fin ni le saut de ligne.

Donc ce qui suit fera l'affaire

_content = new StringReader(sb.ToString()).ReadLine();
Scott Weinstein
la source
1
Élégant oui, mais pas facile à comprendre pour les autres lisant cette ligne. Besoin d'un commentaire explicatif (dans la même ligne bien sûr pour rester un one-liner :))
gumo
1
Ne le fait pas lorsque la chaîne a plus d'une ligne et que vous souhaitez uniquement supprimer la dernière ligne vide.
Florian Berger
6

Qu'en est-il de

_content = sb.ToString().Trim(Environment.NewLine.ToCharArray());
lourd
la source
Cela ne fait pas tout à fait la même chose - cela réduira "abc \ n \ n \ n \ n \ n" par exemple, même si Environment.NewLine est crlf
Marc Gravell
1
Déclarez-le comme une fonctionnalité :-) J'aime la solution.
Stefan Steinegger
5
_content = sb.TrimEnd(Environment.NewLine.ToCharArray());

Cela supprimera bien sûr "\ r \ r \ r \ r" ainsi que "\ n \ n \ n \ n" et d'autres combinaisons. Et dans les "environnements" où NewLine est autre que "\ n \ r", vous pourriez avoir des comportements étranges :-)

Mais si vous pouvez vivre avec cela, je pense que c'est le moyen le plus efficace de supprimer les caractères de nouvelle ligne à la fin d'une chaîne.

coup
la source
3

Que diriez-vous simplement:

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

Cela extraira tous les caractères d'espacement de la fin de la chaîne - un problème uniquement si vous vouliez conserver les espaces sans nouvelle ligne.

Richard Dunlap
la source
1

Un peu de non-réponse, mais le moyen le plus simple de couper une nouvelle ligne d'une chaîne est de ne pas avoir la nouvelle ligne sur la chaîne en premier lieu, en s'assurant qu'elle n'est jamais vue par votre propre code. Autrement dit, en utilisant des fonctions natives qui suppriment la nouvelle ligne. De nombreuses méthodes stream et file / io n'incluront pas la nouvelle ligne si vous demandez une sortie ligne par ligne, bien qu'il puisse être nécessaire d'envelopper quelque chose dans un fichier System.IO.BufferedStream.

Des choses comme System.IO.File.ReadAllLinespeuvent être utilisées à la place de la System.IO.File.ReadAllTextplupart du temps, et ReadLinepeuvent être utilisées à la place d' Readune fois que vous travaillez avec le bon type de flux (par exemple BufferedStream).

Brian
la source
0

Comme Markus l'a souligné, TrimEnd fait le travail maintenant. J'avais besoin d'obtenir des sauts de ligne et des espaces blancs des deux extrémités de la chaîne dans l'environnement Windows Phone 7.8. Après avoir recherché différentes options plus complexes, mon problème a été résolu en utilisant uniquement Trim () - a bien passé les tests suivants

   [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
la source
-2

J'ai dû supprimer les nouvelles lignes partout dans le texte. J'ai donc utilisé:

            while (text.Contains(Environment.NewLine))
            {
                text = text.Substring(0, text.Length - Environment.NewLine.Length);
            }
Ekaterina
la source
1
Ce sera un désastre si le texte contient des NewLine (s) qui ne sont pas à la fin.
Stefan Bergfeldt