9 votes

StringBuilder C# : Vérifier s'il se termine par une nouvelle ligne

J'ai un StringBuilder qui accumule du code. Dans certains cas, il y a 2 lignes vides entre les blocs de code, et j'aimerais faire en sorte qu'il n'y ait plus qu'une seule ligne vide.
Comment puis-je vérifier si le code actuel a déjà une ligne vide à la fin ? (Je préfère ne pas utiliser son ToString() en raison de problèmes de performance).

7voto

KooKiz Points 19056

Vous pouvez accéder à n'importe quel caractère de votre StringBuilder avec son index, comme vous le feriez avec un String .

var sb = new StringBuilder();
sb.Append("Hello world!\n");
Console.WriteLine(sb[sb.Length - 1] == '\n'); // True

1voto

Dave Bish Points 7943

Vous pouvez normaliser les nouvelles lignes à l'aide d'une expression rationnelle :

var test = @"hello

moop

hello";

var regex = new Regex(@"(?:\r\n|[\r\n])+");

var newLinesNormalized = regex.Replace(test, Environment.NewLine);

de la production :

hello
moop
hello

1voto

Dave Thompson Points 56

Contrôle d'une seule ligne. Utilise un type de chaîne, pas StringBuilder, mais vous devriez comprendre l'idée de base.

if (theString.Substring(theString.Length - Environment.NewLine.Length, Environment.NewLine.Length).Contains(Environment.NewLine))
{
     //theString does end with a NewLine
}
else
{
     //theString does NOT end with a NewLine
}

0voto

DareDevil Points 1760

Voici l'exemple complet.

class string_builder
{
    string previousvalue = null;
    StringBuilder sB;
    public string_builder()
    {
        sB = new StringBuilder();
    }
    public void AppendToStringBuilder(string new_val)
    {
        if (previousvalue.EndsWith("\n") &&  !String.IsNullOrEmpty(previousvalue) )
        {
            sB.Append(new_val);
        }
        else
        {
            sB.AppendLine(new_val);
        }

        previousvalue = new_val;
    }

}
class Program
{

    public static void Main(string[] args)
    {
        string_builder sb = new string_builder();            
        sb.AppendToStringBuilder("this is line1\n");
        sb.AppendToStringBuilder("this is line2");
        sb.AppendToStringBuilder("\nthis is line3\n");

    }            
}

-1voto

Noich Points 1712

Puisque je ne me soucie pas des 2 lignes vides au milieu du code, la façon la plus simple est d'utiliser

myCode.Replace(string.Format("{0}{0}", Environment.NewLine),Environment.NewLine);

Cette option ne nécessite aucune modification des classes qui utilisent l'accumulateur de code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X