Обработка строк в массиве
Суть моего вопроса в том, что после парсинга страницы и некоторой обработки у меня имеется массив строк, который выглядит примерно так (каждый переход на новую строку => другой элемент массива):
"prop1: foo1"
"prop2:"
"foo2"
"foo2"
"prop3: foo3"
И мне нужно сделать так, чтобы всё имело такой вид: "prop: foo"
. Задачу осложняет то, что мы не можем предугадать сколько строк нам нужно объединить для каждого свойства. Их может быть и 3, может и не быть вовсе.
И у меня в голове есть некая идея: если строка оканчивается на ':', то присоединяем к ней все последующие строки, но до тех пор пока не встретим строку, содержащую ':'.
- Как я понимаю тут необходимо 2 вложенных цикла, где 1 - будем обходить массив до тех пор, пока не встретит строку, оканчивающуюся на ':', а 2 - который будет обходить все элементы после, но до тех пор, пока не наткнётся на строку с ':'?
- И я правильно понимаю, что логичнее будет заменять ненужные нам элементы (уже конкатенированные) на
string.Empty
, чтобы в последствии легко отсеять их?
Просто в данный момент что-то толковое в голову не идёт
Ответы (2 шт):
Достаточно одного цикла. Обрабатываете строки по очереди. Если в строке содержится ":" - запоминаете её индекс lastprop
. Если в i-й строке снова встретили ":" - объединяете строки от lastprop
до i-1
, записываете lastprop = i
. Аналогично после цикла.
Можно использовать List для добавления необходимых строк, и осуществлять поиск в массиве до следующего найденного знака ':' в очередной строке, после чего добавлять новую строку:
static string[] ParseString(string[] arr)
{
List<string> result = new();
foreach (var item in arr)
{
if (item.Contains(':'))
result.Add(item);
else
result[^1] += result[^1][^1] == ':' ? " " + item : item;
}
return result.ToArray();
}