Подтвердить что ты не робот

Как получить строку строки StringBuilder?

У меня есть экземпляр StringBuilder, где я делаю множество sb.AppendLine("test");, например.

Как мне определить, сколько строк у меня есть?

Я вижу, что класс имеет .Length, но это говорит мне, сколько всего символов.

Любые идеи?

4b9b3361

Ответ 1

Отсортировано по эффективности:

  • Подсчет вызовов AppendLine()
  • Вызов IndexOf() в цикле
  • Использование Regex
  • Использование String.Split()

Последний из них необычайно дорог и генерирует много мусора, не использует.

Ответ 2

Вы можете обернуть StringBuilder своим собственным классом, который будет содержать количество строк по мере их добавления или число "\n" после заполнения вашего конструктора.

Regex.Matches(builder.ToString(), Environment.NewLine).Count

Ответ 3

Вы можете создать класс-оболочку, выполнив следующие действия:

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

Ответ 4

Попробуйте следующее:

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

Ответ 5

Вы должны иметь возможность искать количество вхождений \n в строке.

UPDATE: Одним из способов может быть разделение на символ новой строки и подсчет количества элементов в массиве следующим образом:

sb.ToString().Split('\n').length;

Ответ 6

ОБНОВЛЕНИЕ Что сказал Гейб

b.ToString(). Count (c = > c == '\n') тоже будет работать здесь и может не работать быть намного менее эффективным (помимо создания отдельной копии строка!).


Лучший способ, быстрее, чем создание строки из StringBuilder и ее разделение (или создание строки и regex ing), - это посмотреть в StringBuilder и подсчитать количество символов '\n' в.

Следующий метод расширения будет перечислять через символы в построителе строк, тогда вы можете использовать linq на нем до тех пор, пока ваше сердце не станет довольным.

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

... здесь, счет будет 4

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

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

Забастовкa >

Ответ 7

Если вы собираетесь использовать String.Split(), вам нужно разбить строку на некоторые параметры. Вот так:

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

Это приводит к:

Number of lines: 5

Ответ 8

Выполните собственный подсчет строк StringBuilder, где AppendLine увеличивает количество внутренних строк и предоставляет метод для получения значения количества строк.

Ответ 9

Сделайте регулярное выражение для подсчета числа терминаторов строк (ex:\r\n) в строке. Или загрузите строки в текстовое поле и сделайте подсчет строк, но это способ сделать это

Ответ 10

Вы можете разделить данные строкового строба в массив String [], а затем использовать String []. Длина для количества строк.

что-то вроде ниже:

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