Не очень умное решение, но следующий код renumbers список строк, заданных в качестве ввода. Он разбивает каждую строку в пространстве, отделяющем нумерацию от остальных, определяет уровень вложенности путем подсчета количества точек в нумерации и использует эту информацию вместе с уровнем вложенности последней строки для обновления списка с текущей нумерацией для каждый уровень гнездования. Наконец, текущая нумерация, хранящаяся в списке, соединяется с текстом и выводится.
List<Int32> numbering = new List<Int32>();
Int32 lastNestingLevel = -1;
foreach (String line in lines)
{
String[] parts = line.Split(new Char[] { ' ' }, 2);
Int32 currentNestingLevel = parts[0].Count(c => c == '.');
if (currentNestingLevel > lastNestingLevel)
{
// Start a new nesting level with number one.
numbering.Add(1);
}
else if (currentNestingLevel == lastNestingLevel)
{
// Increment the number of the current nesting level.
numbering[currentNestingLevel] += 1; }
else if (currentNestingLevel < lastNestingLevel)
{
// Remove the deepest nesting level...
numbering.RemoveAt(numbering.Count - 1);
// ...and increment the numbering of the current nesting level.
numbering[currentNestingLevel] += 1;
}
lastNestingLevel = currentNestingLevel;
String newNumbering = String.Join(".", numbering
.Select(n => n.ToString())
.ToArray());
Console.WriteLine(newNumbering + " " + parts[1]);
}
Для следующего входа
List<String> lines = new List<String>()
{
"1 Welcome",
"2 Whats New",
//"2.1 Gifts",
"2.2 Ideas",
"2.3 Others",
//"2.3.1 Novelty",
"2.3.2 Boats",
"2.4 Vehicals",
"2.5 Fruits"
};
выход состоит в следующем.
1 Welcome
2 Whats New
2.1 Ideas
2.2 Others
2.2.1 Boats
2.3 Vehicals
2.4 Fruits
UPDATE
Вот вариант с использованием словаря - это упрощает обновление, но усложняет генерацию новой нумерации немного.
Этот вариант также исправляет ошибку в первой версии. Если уровень вложенности падает более чем на один раз, первый вариант будет генерировать ложные выходы.
2.3.2.1 Vehicals
2.5 Fruits <= nesting level drops by two
Я предполагаю вход, где уровень вложенности повышает более чем на один сразу не является допустимым или по крайней мере более точным определением, как обрабатывать этот случай не требуется, но оба варианта может иметь проблемы с таким родом входы.
Как вы делаете определение, что должно быть 2,1 по сравнению, скажем, 3? – CAbbott
2.1 является дочерним по 2, поэтому, если 2.1 удаляется, следующий ребенок 2.2 идеи становятся 2.1 – bugBurger
В какой структуре хранятся элементы? Или вы хотите выполнить это, учитывая только элементы в виде списка строк? –