Member 10410972 Ответов: 3

Перемещение строк из многострочного текстового поля textbox1.Текс, если textbox1.текст начинается с ...с#


Всем привет,
У меня есть многострочный textBox1.Text на форме.
Я хотел бы, если какая-то строка в textBox1.Text начинается с "some", то каждая такая строка перемещается в конец строк над этой строкой.

Например:

Если мой textBox1.Text содержит (перед выполнением кода):

Первая строка
Вторая строка
Третья строка
некоторые текст
Пятая строка
Шестая строка
Седьмая строчка
некоторые текст

После выполнения кода

Первая строка
Вторая строка
Третья строканекоторый текст
Пятая строка
Шестая строка
Седьмая строчканекоторый текст

Что я уже пробовал:

что-то вроде:

if (textbox1.Text.StartsWith("некоторые"))
{
// код здесь
}

Надеюсь, вы меня понимаете. Спасибо.

Kornfeld Eliyahu Peter

Вы можете использовать регулярное выражение, чтобы заменить перевод строки-одни-текст с какой-текста'...
Это должно работать даже в том случае, когда у вас есть "некоторый текст" несколько раз подряд...

3 Ответов

Рейтинг:
1

BillWoodruff

textBox1.Text = textBox1.Text.Replace("\r\nsome text", "some text");


Member 10410972

Спасибо, Билл, но я думал на самом деле, что каждая четвертая строка начинается с "некоторых", но остальная часть текста тех строк, которые начинаются с некоторых, не одинакова (она отличается).
Например:

Если мой textBox1.Text содержит (перед выполнением кода):

Первая строка
Вторая строка
Третья строка
некоторый текст
Пятая строка
Шестая строка
Седьмая строчка
какой-то другой текст
девятая линия
десятая строка
одиннадцатая строка
немного бла бла

После выполнения кода

Первая строка
Вторая строка
Третий строчный текст
Пятая строка
Шестая строка
Седьмая строка другого текста
девятая линия
десятая строка
одиннадцатый linesome бла бла

BillWoodruff

Если вам нужен поиск и замена диких карт, см. Решение Maciej ниже и рассмотрите возможность использования регулярного выражения.

Maciej Los

5ed!

Рейтинг:
1

BillWoodruff

Цитата:
Я хотел бы переместить каждую третью строку в textBox1.Text в конец строки, которая находится выше этой строки.
Для преобразования коллекции строк таким образом, чтобы они были отформатированы с каждой 3-й строкой, добавленной ко второй строке:
string[] splitLines = textBox1.Text.Split(new char[]
{   
'\r', '\n'
}, StringSplitOptions.RemoveEmptyEntries);

StringBuilder sb = new StringBuilder();

textBox1.Clear();

for (int i = 0; i < splitLines.Length; i++)
{
    sb.Append(splitLines[i]);
    
    if (i == 0 || i % 3 != 2)
    {
        sb.Append("\r\n");
    }
}

textBox1.Text = sb.ToString();
Используйте StringBuilder, чтобы уменьшить ненужное выделение памяти.


Maciej Los

Еще 5!

Рейтинг:
0

Maciej Los

Согласно вашему комментарию к решению № 1 by Биллвудраф[^]...

Before executing the code
First line
Second line
Third line
some text
Fifth line
Sixth line
Seventh line
some different text
ninth line
tenth line
eleventh line
some bla bla

After executing the code
First line
Second line
Third linesome text
Fifth line
Sixth line
Seventh linesome different text
ninth line
tenth line
eleventh linesome bla bla



Решение Linq:
//your lines
string[] lines = {"First line", "Second line", "Third line",
	"some text", "Fifth line", "Sixth line", "Seventh line", "some different text",
	"ninth line", "tenth line", "eleventh line", "some bla bla"};
//find lines which does not contain "line" word
var notnumberedlines = lines
	.Where(x=>!x.Contains("line"))
	.Select((x,i) => new {Index = ((i+1)*3)-1, Line=x})
	.ToList();
//remove these lines
var cleanlines = lines.Except(notnumberedlines.Select(x=>x.Line));
//add lines with "some text", "some different text", "somebla bla"
//use left outer join on index
var together = from c in cleanlines.Select((x,i)=> new{Index = i, Line = x})
		join n in notnumberedlines on c.Index equals n.Index into g
		select c.Line +  g.Select(y=>y.Line).SingleOrDefault();


Для получения более подробной информации, пожалуйста, смотрите:
LINQ, которая: .Net-язык интегрированных запросов[^]
Начало работы с LINQ на языке C# | Microsoft Docs[^]
предложение Join (Справочник по c#) | Майкрософт документы[^]

[РЕДАКТИРОВАТЬ]
Согласно нашему обсуждению (в комментариях к ответу), если вы хотите соединить каждую третью строку с предыдущей, попробуйте сделать это:

//generate 50 lines: line1, line2, ... , line50
string[] lines = Enumerable.Range(1,50).Select(x=> string.Format("Line{0}",x)).ToArray();

//get every 3. line
var everythirdline = lines
	.Where((x,y)=>(y+1)%3==0)
	.Select((x,i) => new {Index = ((i+1)*2)-1, Line=x})
	.ToList();

//remove these lines
var cleanlines = lines.Except(everythirdline.Select(x=>x.Line));

//use left outer join on index
var together = (from c in cleanlines.Select((x,i)=> new{Index = i, Line = x})
		join n in everythirdline on c.Index equals n.Index into g
		select c.Line +  g.Select(y=>y.Line).SingleOrDefault())
                .ToList();


Результат:
Line1 
Line2Line3 
Line4 
Line5Line6 
Line7 
Line8Line9 
Line10 
Line11Line12 
Line13 
Line14Line15 


BillWoodruff

+5

Maciej Los

Спасибо, Билл.

Member 10410972

Ладно, я не думаю, что ты хорошо меня понимаешь.
Чтобы сказать более просто:
Я хотел бы переместить каждую третью строку в textBox1.Text в конец строки, которая находится выше этой строки.

Например:

Если мой textBox1.Text содержит (перед выполнением кода):

Первая строка
Вторая строка
Третья строка
Четвертая строка
Пятая строка
Шестая строка
Седьмая строчка
Восьмая линия
Девятая линия
Десятая строка
Одиннадцатая строка
Двенадцатая строка

После выполнения кода

Первая строка
Вторая линия lineThird
Четвертая строка
Пятая строчка lineSixth
Седьмая строчка
Восьмая строчка lineNinth
Десятая строка
Одиннадцатая линия welfth line

Примечание:
текстовое поле textbox1.Текст насчитывает около 200 строк.
Если это возможно, то как я могу это сделать, а если нет, то приношу свои извинения.
Спасибо.

Maciej Los

Предположим, что вы не хотите удалять какую-то линию, но чтобы соединить каждую 3. линию, вы должны использовать другой алгоритм. Смотрите обновленный ответ в течение следующих нескольких минут.

BillWoodruff

Пожалуйста, отредактируйте свой оригинальный пост, если вы изменили проблему.

Member 10410972

Большое спасибо, что хорошо работает.

Maciej Los

Отлично!
Пожалуйста, примите мой ответ как решение (зеленая кнопка).