web-dev-qa-db-fra.com

Comment récupérer un compte de ligne StringBuilder?

J'ai un StringBuilder instance où je fais de nombreux sb.AppendLine("test"); par exemple.

Comment puis-je savoir combien de lignes j'ai?

Je vois la classe a .Length Mais cela me dit combien de personnages de tous.

Des idées?

26
Jon

Trié par efficacité:

  1. Compter vos appels Appendline ()
  2. Appel IndexOf () dans une boucle
  3. Utilisation de regex
  4. En utilisant string.split ()

Le dernier est extraordinaire cher et génère lots des ordures, n'utilisez pas.

25
Hans Passant

Vous pouvez envelopper StringBuilder avec votre propre classe qui conserverait un nombre de lignes telles qu'elles sont ajoutées ou que le nombre de "\ N" après votre constructeur est plein.

Regex.Matches(builder.ToString(), Environment.NewLine).Count
21
Jake Pearson

Vous pouvez créer une classe wrapper procéder à ce qui suit:

public class Wrapper
{
    private StringBuilder strBuild = null;
    private int count = 0;
    public Wrapper(){
        strBuild = new StringBuilder();
    }
    public void AppendLine(String toAppendParam){
        strBuild.AppendLine(toAppendParam);
        count++;
    }
    public StringBuilder getStringBuilder(){
        return strBuild;
    }

    public int getCount(){
        return count;
    }
}
6
Koekiebox

Essaye ça:

sb.ToString().Split(System.Environment.NewLine.ToCharArray()).Length;
3
Bravax

[~ # ~] Mise à jour [~ # ~]quelle gabe a dit

b.Tostring (). Compte (c => c == '\ n') fonctionnerait ici aussi, et pourrait ne pas être beaucoup moins efficace (en plus de créer une copie séparée de la chaîne!).


Un meilleur moyen, plus rapide que la création d'une chaîne du StringBuilder et le scinder (ou la création de la chaîne et regexing IT), est de regarder dans le StringBuilder et de compter le nombre de '\n' caractères là-bas.

La méthode d'extension suivante énumérera via les caractères du constructeur de cordes, vous pouvez ensuite linq dessus jusqu'à ce que votre cœur soit contenu.

    public static IEnumerable<char> GetEnumerator(this StringBuilder sb)
    {
        for (int i = 0; i < sb.Length; i++)
            yield return sb[i];
    }

... Utilisé ici, le nombre sera 4

        StringBuilder b = new StringBuilder();
        b.AppendLine("Hello\n");
        b.AppendLine("World\n");

        int lineCount = b.GetEnumerator().Count(c => c =='\n');
2
Binary Worrier

Vous devriez être en mesure de rechercher le nombre de seventions de\n dans la chaîne.

Mise à jour: une solution pourrait être de se diviser sur le nouveau caractère et compter le nombre d'éléments de la matrice comme suit:

sb.ToString().Split('\n').length;
2
Paul Hadfield

Si vous allez utiliser string.split (), vous devrez diviser la chaîne avec quelques options. Comme ça:

static void Main(string[] args)
{
    var sb = new StringBuilder();
    sb.AppendLine("this");
    sb.AppendLine("is");
    sb.AppendLine("a");
    sb.AppendLine("test");

    // StringSplitOptions.None counts the last (blank) newline 
    // which the last AppendLine call creates
    // if you don't want this, then replace with 
    // StringSplitOptions.RemoveEmptyEntries
    var lines = sb.ToString().Split(
        new string[] { 
            System.Environment.NewLine }, 
        StringSplitOptions.None).Length;

    Console.WriteLine("Number of lines: " + lines);

    Console.WriteLine("Press enter to exit.");
    Console.ReadLine();
}

Il en résulte:

Number of lines: 5

2
code4life

Dérivez votre propre ligne de comptage StringBuilderAppendLine UPS Un nombre de lignes interne et fournit une méthode pour obtenir la valeur du nombre de lignes.

1
JLWarlow

Faites une regex pour compter le nombre de terminateurs de ligne (ex:\r\n) dans la chaîne. Ou, chargez les chaînes dans une zone de texte et faites un compte de ligne, mais c'est la façon de le faire

0
Ayubinator

Vous pouvez diviser les données de cordes de bulletin en grord [], puis utiliser la chaîne []. Longueur du nombre de lignes.

quelque chose comme ci-dessous:

String[] linestext = sb.Split(newline)
Console.Writeline(linetext.Length)
0
swapneel