web-dev-qa-db-fra.com

Quel est le moyen le plus simple en C # de couper une nouvelle ligne d'une chaîne?

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 puisque Trim ne semble pas avoir de paramètre surchargé pour une collection de chaînes, mais uniquement des caractères.

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

96
Edward Tanguay

Ce qui suit fonctionne pour moi.

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

ou

sb.ToString().TrimEnd( Environment.NewLine.ToCharArray());
214
Simon Wilson

.Trim() supprime \r\n pour moi (avec .NET 4.0).

28
xr280xr

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 un 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 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);
}
14
Jon Skeet

Utilisez le cadre. La méthode ReadLine () présente les éléments suivants:

Une ligne est définie comme une séquence de caractères suivis d'un saut de ligne ("\ n"), un retour chariot ("\ r") ou un le retour du chariot a suivi immédiatement par un saut de ligne ("\ r\n"). La chaîne qui est retourné ne contient pas le retour du chariot ou de la ligne d'arrivée alimentation.

Donc, ce qui suit fera l'affaire

_content = new StringReader(sb.ToString()).ReadLine();
8
Scott Weinstein

Qu'en est-il de

_content = sb.ToString().Trim(Environment.NewLine.ToCharArray());
5
heavyd
_content = sb.TrimEnd(Environment.NewLine.ToCharArray());

Ceci supprimera bien sûr "\ r\r\r\r" ainsi que "\ n\n\n\n" et autres combinaisons . Et dans les "environnements" où NewLine est différent de "\ n\r "vous pourriez avoir des comportements étranges :-)

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

4
bang

Que diriez-vous juste:

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

Tous les caractères d'espacement situés à la fin de la chaîne seront extraits. Ce n'est un problème que si vous souhaitez conserver les espaces non nouveaux.

2
Richard Dunlap

Un peu comme une 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 s'assurant qu'elle ne soit jamais vue par votre propre code. C'est-à-dire en utilisant des fonctions natives qui suppriment la nouvelle ligne. De nombreuses méthodes stream et file/io n'incluent pas la nouvelle ligne si vous demandez une sortie ligne par ligne, bien qu'il soit parfois nécessaire d'envelopper quelque chose dans un System.IO.BufferedStream.

Des éléments tels que System.IO.File.ReadAllLines peuvent être utilisés à la place de System.IO.File.ReadAllText la plupart du temps, et ReadLine à la place de Read une fois que vous utilisez le bon type de flux (par exemple, BufferedStream).

1
Brian

Comme Markus l'a souligné, TrimEnd fait le travail à présent. J'avais besoin d'obtenir des sauts de ligne et des espaces aux 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 + "'");
    }
0
juhariis