Ответ 1
-
int numLines = aDiff.text.Length - aDiff.text.Replace(Environment.NewLine, string.Empty).Length;
-
int numLines = aDiff.text.Split('\n').Length;
оба дадут вам количество строк в тексте...
Я удаляю текст из строки и что заменить каждую строку пустой строкой.
Некоторые предпосылки: Я пишу функцию сравнения, которая сравнивает две строки. Его все работает отлично и отображаются в нем два отдельных веб-браузера. Когда я пытаюсь прокрутить вниз свои браузеры, строки имеют разные длины, я хочу заменить текст, который я удаляю пустой строкой, чтобы мои строки имели одинаковую длину.
В приведенном ниже коде я хочу подсчитать, сколько строк aDiff.Text имеет
Вот мой код:
public string diff_prettyHtmlShowInserts(List<Diff> diffs)
{
StringBuilder html = new StringBuilder();
foreach (Diff aDiff in diffs)
{
string text = aDiff.text.Replace("&", "&").Replace("<", "<")
.Replace(">", ">").Replace("\n", "<br>"); //¶
switch (aDiff.operation)
{
case Operation.DELETE:
//foreach('\n' in aDiff.text)
// {
// html.Append("\n"); // Would like to replace each line with a blankline
// }
break;
case Operation.EQUAL:
html.Append("<span>").Append(text).Append("</span>");
break;
case Operation.INSERT:
html.Append("<ins style=\"background:#e6ffe6;\">").Append(text)
.Append("</ins>");
break;
}
}
return html.ToString();
}
int numLines = aDiff.text.Length - aDiff.text.Replace(Environment.NewLine, string.Empty).Length;
int numLines = aDiff.text.Split('\n').Length;
оба дадут вам количество строк в тексте...
Неэффективно, но все же:
var newLineCount = aDiff.Text.Split('\n').Length -1;
Вариант, который не выделяет новые строки или массив строк
private static int CountLines(string str)
{
if (str == null)
throw new ArgumentNullException("str");
if (str == string.Empty)
return 0;
int index = -1;
int count = 0;
while (-1 != (index = str.IndexOf(Environment.NewLine, index + 1)))
count++;
return count + 1;
}
int newLineLen = Environment.NewLine.Length;
int numLines = aDiff.text.Length - aDiff.text.Replace(Environment.NewLine, string.Empty).Length;
if (newLineLen != 0)
{
numLines /= newLineLen;
numLines++;
}
Чуть более надежный, учитывая первую строку, в которой не будет разрыва строки.
чтобы облегчить задачу, я поместил решение из poncha в хороший способ расширения, поэтому вы можете использовать его просто так:
int numLines = aDiff.text.LineCount();
Код:
/// <summary>
/// Extension class for strings.
/// </summary>
public static class StringExtensions
{
/// <summary>
/// Get the nummer of lines in the string.
/// </summary>
/// <returns>Nummer of lines</returns>
public static int LineCount(this string str)
{
return str.Split('\n').Length;
}
}
Удачи...
Я провел кучу тестирования производительности различных методов (Split, Replace, for loop over chars, Linq.Count), а победителем был метод Replace (метод Split был немного быстрее, когда строки были меньше 2 КБ, но не так много).
Но есть 2 ошибки в принятом ответе. Одна ошибка, когда последняя строка не заканчивается символом новой строки, она не будет считать последнюю строку. Другая ошибка заключается в том, что если вы читаете файл с окончанием строки UNIX в Windows, он не будет считать никаких строк, поскольку среда. Новая строка \r\n
и не будет существовать (вы всегда можете просто использовать \n
, так как это последняя char строки, заканчивающейся для UNIX и Windows).
Итак, вот простой метод расширения...
public static int CountLines(this string text)
{
int count = 0;
if (!string.IsNullOrEmpty(text))
{
count = text.Length - text.Replace("\n", string.Empty).Length;
// if the last char of the string is not a newline, make sure to count that line too
if (text[text.Length - 1] != '\n')
{
++count;
}
}
return count;
}
Вы также можете использовать Linq для подсчета вхождений строк, например:
int numLines = aDiff.Count(c => c.Equals('\n')) + 1;
Поздно, но предлагает альтернативу другим ответам.
Эффективная и недорогая память.
Regex.Matches( "Your String" , System.Environment.NewLine).Count ;
Конечно, мы можем расширить наш класс строк
using System.Text.RegularExpressions ;
public static class StringExtensions
{
/// <summary>
/// Get the nummer of lines in the string.
/// </summary>
/// <returns>Nummer of lines</returns>
public static int LineCount(this string str)
{
return Regex.Matches( str , System.Environment.NewLine).Count ;
}
}
ссылка: μBio, Dieter Meemken
using System.Text.RegularExpressions;
Regex.Matches(text, "\n").Count
Я думаю, что подсчет появления '\n'
является наиболее эффективным способом, учитывая скорость и использование памяти.
Использование split('\n')
- это плохая идея, потому что он создает новые массивы строк, что снижает производительность и эффективность! особенно когда ваша строка становится больше и содержит больше строк.
Замена символа '\n'
пустым символом и вычисление разницы также неэффективны, поскольку он должен выполнять несколько операций, таких как поиск, создание новых строк и распределение памяти и т.д.
Вы можете просто выполнить одну операцию, то есть выполнить поиск. Поэтому вы можете просто подсчитать появление символа '\n'
в строке, как предположил @lokimidgard.
Стоит отметить, что поиск символа '\n'
лучше, чем поиск "\r\n"
(или Environment.NewLine
в Windows), потому что предыдущий (т.е. '\n'
) работает как для окончаний строки Unix, так и для Windows.
Здесь поздно вечером, но я думаю, что это обрабатывает все строки, даже последнюю строку (по крайней мере, на окнах):
Regex.Matches(text, "$", RegexOptions.Multiline).Count;