C # Подсчитать все случаи перевода строки и возврата каретки - PullRequest
0 голосов
/ 03 июня 2009

В C # я делаю простой текстовый редактор с номерами строк. Я хочу посчитать количество допустимых разрывов строк в строке.

я хочу считать

\ г \ п \ Г \ п

Как я могу это сделать?

Или, еще лучше, может кто-нибудь указать мне статью о том, как номер строки в поле RTF

Ответы [ 5 ]

4 голосов
/ 03 июня 2009

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

Я бы использовал существующий тип, который уже знает об окончаниях строк, а именно TextReader, в сочетании с моим типом LineReader из MiscUtil :

string text = "ab\ncd";
int lines = new LineReader(() => new StringReader(text)).Count();

В качестве альтернативы, без зависимостей:

public IEnumerable<string> GetLines(string text)
{
    using (TextReader reader = new StringReader(text))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            return line;
        }
    }
}

, то:

int lineCount = GetLines(text).Count();

Обратите внимание, что здесь будут учитываться фактические строки текста, а не разрывы строк - это может незначительно отличаться от того, что вы хотите (например, обычно это будет разрывы строк + 1, но не в том случае, если в конце текста есть разрыв строки ).

2 голосов
/ 03 июня 2009
2 голосов
/ 03 июня 2009

Подсчет вхождений строки:

public static int CountStringOccurrences(string text, string pattern)
        {
            // Loop through all instances of the string 'text'.
            int count = 0;
            int i = 0;
            while ((i = text.IndexOf(pattern, i)) != -1)
            {
                i += pattern.Length;
                count++;
            }
            return count;
        }
0 голосов
/ 03 июня 2009
public static int LineBreakCount(string s)
{
    if (s == null) throw new ArgumentNullException("s");

    return LineBreakCount(s, new[]{"\r\n", "\r", "\n"});
}

public static int LineBreakCount(string s, params string[] patterns)
{
    if (s == null) throw new ArgumentNullException("s");
    if (patterns == null) throw new ArgumentNullException("patterns");

    return s.Split(patterns, StringSplitOptions.None).Length;
}

Порядок шаблонов в первой перегрузке важен, потому что если вы сначала выполните «\ r» или «\ n», вы получите почти или ровно в два раза больше элементов в массиве, так как он выполняет их в указанном порядке.

0 голосов
/ 03 июня 2009
...