2013-03-06 4 views
1

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

Включите эту
blah blah blah
some stuff to be numbered
more stuff to number

к этому
1 blah blah blah
2 some stuff to be numbered
3 more stuff to number

до сих пор у меня есть
output.Text = Regex.Replace(input.Text, input.Text, @"{1,}+");

Но это меняет весь текст с {1,}
Я не могу показаться, чтобы выяснить, как цикл каждой строки обратно после размещения ряда и места.
(Я новичок в C#)
Любые предложения?

ответ

2

Это может быть проще реализовать не-Regex решения:

var numberedLines = input.Text 
    .Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None) 
    .Select ((line, index) => (index + 1) + " " + line) 
    .ToArray(); 
var result = string.Join(Environment.NewLine, numberedLines); 
output.Text = result; 

Первая строка использует string.Split() разделить строку вокруг линии возвращается в массив. Затем я использую метод LINQ .Select для применения функции к каждому элементу массива - в этом случае добавление номера строки и пробела в начале каждой строки (index + 1 необходимо, потому что значения индекса основаны на 0). Затем я использую метод string.Join, чтобы объединить массив в одну строку.

Демо: http://ideone.com/DrFTfl


Это на самом деле может быть сделано с помощью регулярных выражений, если вы используете MatchEvaluator делегат применить нумерацию строк:

var index = 1; 
output.Text = Regex.Replace(input.Text, "^", 
    (Match m) => (index++).ToString() + " ", 
    RegexOptions.Multiline); 

Узор ^ обычно соответствует началу выражение. Однако, с RegexOptions.Multiline, он соответствует началу каждой строки. Затем для замены я использую делегат (анонимная функция), который добавляет # + пробел в начало строки, а затем увеличивает индексный счетчик для следующей строки.

Демо: http://ideone.com/9LD0ZY

+0

Когда я попытался использовать решение без регекса, я получил красную строку squiggly под 'string.Join (" \ n ", numberedLines);' Regex solution работал отлично. любая идея, почему не-Regex не работает? – Kazankoph

+1

небольшое улучшение: 'string.Join (" \ r \ n ", input.Text.Split ('\ n'). Выберите ((строка, строка) => string.Format (" {0} \ t {1} ", lineNumber + 1, line.TrimEnd ('\ r'))));' – publicgk

+0

@ Kazankoph: Ah. См. Обновление с помощью .ToArray() '. По-видимому, моя локальная тестовая среда имеет перегрузку, которая позволяет передавать 'IEnumerable' в' string.Join', но обычно для этого требуется массив. – mellamokb

2

Почему не split по \r\n, сцепить каждую линию string[] с увеличенным числом и пространства, а затем join по \r\n?

+2

Это простое решение, скорее всего, лучшее. Возможно, раскол на окружающую среду.NewLine вместо константы (но наиболее вероятной) из \ r \ n –

0

Если вы новичок в C# позволяет сохранить его как можно более простым.

По внешнему виду у вас уже есть все ваши строки. Таким образом, это сводится к следующему:

 // store all lines in a list 
     // ... 

     var list = new List<string> {"blah", "blah2", "and some more blah"}; 
     var list2 = new List<string>(); 
     var i = 1; 
     foreach (var str in list) 
     { 
      list2.Add(string.Format("{0} {1}", i, str)); 
      i++; 
     } 

     // write contents of list2 back to wherever you want them visualized 
Смежные вопросы