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

Как подсчитать строки в строке?

Я удаляю текст из строки и что заменить каждую строку пустой строкой.

Некоторые предпосылки: Я пишу функцию сравнения, которая сравнивает две строки. Его все работает отлично и отображаются в нем два отдельных веб-браузера. Когда я пытаюсь прокрутить вниз свои браузеры, строки имеют разные длины, я хочу заменить текст, который я удаляю пустой строкой, чтобы мои строки имели одинаковую длину.

В приведенном ниже коде я хочу подсчитать, сколько строк aDiff.Text имеет

Вот мой код:

public string diff_prettyHtmlShowInserts(List<Diff> diffs)
    {
        StringBuilder html = new StringBuilder();

        foreach (Diff aDiff in diffs)
        {
            string text = aDiff.text.Replace("&", "&amp;").Replace("<", "&lt;")
              .Replace(">", "&gt;").Replace("\n", "<br>"); //&para;
            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();
    }
4b9b3361

Ответ 1

  • int numLines = aDiff.text.Length - aDiff.text.Replace(Environment.NewLine, string.Empty).Length;

  • int numLines = aDiff.text.Split('\n').Length;

оба дадут вам количество строк в тексте...

Ответ 2

Неэффективно, но все же:

var newLineCount = aDiff.Text.Split('\n').Length -1;

Ответ 3

Вариант, который не выделяет новые строки или массив строк

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

Ответ 4

int newLineLen = Environment.NewLine.Length;
int numLines = aDiff.text.Length - aDiff.text.Replace(Environment.NewLine, string.Empty).Length;
if (newLineLen != 0)
{
    numLines /= newLineLen;
    numLines++;
}

Чуть более надежный, учитывая первую строку, в которой не будет разрыва строки.

Ответ 5

чтобы облегчить задачу, я поместил решение из 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;
    }
}

Удачи...

Ответ 6

Я провел кучу тестирования производительности различных методов (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;
}

Ответ 7

Вы также можете использовать Linq для подсчета вхождений строк, например:

int numLines = aDiff.Count(c => c.Equals('\n')) + 1;

Поздно, но предлагает альтернативу другим ответам.

Ответ 8

Эффективная и недорогая память.

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

Ответ 9

using System.Text.RegularExpressions;

Regex.Matches(text, "\n").Count

Я думаю, что подсчет появления '\n' является наиболее эффективным способом, учитывая скорость и использование памяти.

Использование split('\n') - это плохая идея, потому что он создает новые массивы строк, что снижает производительность и эффективность! особенно когда ваша строка становится больше и содержит больше строк.

Замена символа '\n' пустым символом и вычисление разницы также неэффективны, поскольку он должен выполнять несколько операций, таких как поиск, создание новых строк и распределение памяти и т.д.

Вы можете просто выполнить одну операцию, то есть выполнить поиск. Поэтому вы можете просто подсчитать появление символа '\n' в строке, как предположил @lokimidgard.

Стоит отметить, что поиск символа '\n' лучше, чем поиск "\r\n" (или Environment.NewLine в Windows), потому что предыдущий (т.е. '\n') работает как для окончаний строки Unix, так и для Windows.

Ответ 10

Здесь поздно вечером, но я думаю, что это обрабатывает все строки, даже последнюю строку (по крайней мере, на окнах):

Regex.Matches(text, "$", RegexOptions.Multiline).Count;