У меня есть экземпляр StringBuilder
, где я делаю множество sb.AppendLine("test");
, например.
Как мне определить, сколько строк у меня есть?
Я вижу, что класс имеет .Length
, но это говорит мне, сколько всего символов.
Любые идеи?
У меня есть экземпляр StringBuilder
, где я делаю множество sb.AppendLine("test");
, например.
Как мне определить, сколько строк у меня есть?
Я вижу, что класс имеет .Length
, но это говорит мне, сколько всего символов.
Любые идеи?
Отсортировано по эффективности:
Последний из них необычайно дорог и генерирует много мусора, не использует.
Вы можете обернуть StringBuilder
своим собственным классом, который будет содержать количество строк по мере их добавления или число "\n" после заполнения вашего конструктора.
Regex.Matches(builder.ToString(), Environment.NewLine).Count
Вы можете создать класс-оболочку, выполнив следующие действия:
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;
}
}
Попробуйте следующее:
sb.ToString().Split(System.Environment.NewLine.ToCharArray()).Length;
Вы должны иметь возможность искать количество вхождений \n в строке.
UPDATE: Одним из способов может быть разделение на символ новой строки и подсчет количества элементов в массиве следующим образом:
sb.ToString().Split('\n').length;
ОБНОВЛЕНИЕ Что сказал Гейб
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 >
Если вы собираетесь использовать 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
Выполните собственный подсчет строк StringBuilder
, где AppendLine
увеличивает количество внутренних строк и предоставляет метод для получения значения количества строк.
Сделайте регулярное выражение для подсчета числа терминаторов строк (ex:\r\n) в строке. Или загрузите строки в текстовое поле и сделайте подсчет строк, но это способ сделать это
Вы можете разделить данные строкового строба в массив String [], а затем использовать String []. Длина для количества строк.
что-то вроде ниже:
String[] linestext = sb.Split(newline)
Console.Writeline(linetext.Length)