Обработка строк в массиве

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

"prop1: foo1"
"prop2:"
"foo2"
"foo2"
"prop3: foo3"

И мне нужно сделать так, чтобы всё имело такой вид: "prop: foo". Задачу осложняет то, что мы не можем предугадать сколько строк нам нужно объединить для каждого свойства. Их может быть и 3, может и не быть вовсе.

И у меня в голове есть некая идея: если строка оканчивается на ':', то присоединяем к ней все последующие строки, но до тех пор пока не встретим строку, содержащую ':'.

  1. Как я понимаю тут необходимо 2 вложенных цикла, где 1 - будем обходить массив до тех пор, пока не встретит строку, оканчивающуюся на ':', а 2 - который будет обходить все элементы после, но до тех пор, пока не наткнётся на строку с ':'?
  2. И я правильно понимаю, что логичнее будет заменять ненужные нам элементы (уже конкатенированные) на string.Empty, чтобы в последствии легко отсеять их?

Просто в данный момент что-то толковое в голову не идёт


Ответы (2 шт):

Автор решения: MBo

Достаточно одного цикла. Обрабатываете строки по очереди. Если в строке содержится ":" - запоминаете её индекс lastprop. Если в i-й строке снова встретили ":" - объединяете строки от lastprop до i-1, записываете lastprop = i. Аналогично после цикла.

→ Ссылка
Автор решения: Mark Shcerbakov

Можно использовать 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();
}
→ Ссылка