ti-enxame.com

Como recuperar uma contagem de linhas StringBuilder?

Eu tenho uma instância StringBuilder onde estou executando várias sb.AppendLine("test"); por exemplo.

Como resolvo quantas linhas tenho?

Vejo que a turma tem .Length mas isso me diz quantos caracteres no total.

Alguma ideia?

26
Jon

Ordenado por eficiência:

  1. Contando suas chamadas AppendLine ()
  2. Chamando IndexOf () em um loop
  3. Usando Regex
  4. Usando String.Split ()

O último é extraordinariamente caro e gera lotes de lixo, não use.

25
Hans Passant

Você pode agrupar StringBuilder com sua própria classe que manterá uma contagem de linhas à medida que são adicionadas ou pode ter o número de '\ n' depois que o construtor estiver cheio.

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

Você pode criar uma classe de wrapper da seguinte maneira:

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

Tente o seguinte:

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

[~ # ~] atualização [~ # ~] O que Gabe disse

b.ToString (). Count (c => c == '\ n') também funcionaria aqui e pode não ser muito menos eficiente (além de criar uma cópia separada da string!).


Uma maneira melhor, mais rápida do que criar uma string do StringBuilder e dividi-la (ou criar a string e regexing), é olhar para o StringBuilder e contar o número de '\n' caracteres lá dentro.

O método de extensão a seguir irá enumerar os caracteres no construtor de cadeias de caracteres; você poderá linq-lo até que seu coração esteja satisfeito.

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

... usado aqui, a contagem será 4

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

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

Você deve poder procurar o número de ocorrências de\n na string.

ATUALIZAÇÃO: Uma maneira poderia ser dividir o caractere de nova linha e contar o número de elementos na matriz da seguinte maneira:

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

Se você for usar String.Split (), será necessário dividir a string com algumas opções. Como isso:

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();
}

Isto resulta em:

Number of lines: 5

2
code4life

Derive sua própria contagem de linhas StringBuilder onde AppendLine aumenta uma contagem interna de linhas e fornece um método para obter o valor da contagem de linhas.

1
JLWarlow

Faça um regex para contar o número de terminadores de linha (ex:\r\n) na cadeia de caracteres. Ou carregue as strings em uma caixa de texto e faça uma contagem de linhas, mas essa é a maneira mais fácil de fazer isso

0
Ayubinator

Você pode dividir os dados do construtor de string na matriz String [] e, em seguida, usar String [] .Comprimento para o número de linhas.

algo como abaixo:

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