Я не уверен, что вы являетесь структурой для хранения иерархии строк, но давайте предположим, что у вас есть способ получить дочерние строки каждой строки по мере необходимости (например, вы можете получить «Кровати» и «Столы» от 'Главная').
Сначала я хотел объявить теги как константы:
public const string OPEN_LIST_TAG = "<ul>";
public const string CLOSE_LIST_TAG = "</ul>";
public const string OPEN_LIST_ITEM_TAG = "<li>";
public const string CLOSE_LIST_ITEM_TAG = "</li>";
Тогда я хотел бы создать рекурсивный метод, используя что-то вроде строки строителя:
/// <summary>
/// Adds another level of HTML list and list items to a string
/// </summary>
/// <param name="str">The string to add</param>
/// <param name="liStrings">The list of strings at this level to add</param>
/// <param name="iTabIndex">The current number of tabs indented from the left</param>
public void GenerateHTML(System.Text.StringBuilder str, List<string> liStrings, int iTabIndex) {
//add tabs to start of string
this.AddTabs(str, iTabIndex);
//append opening list tag
str.AppendLine(OPEN_LIST_TAG);
foreach (string strParent in liStrings) {
//add tabs for list item
this.AddTabs(str, iTabIndex + 1);
//if there are child strings for this string then loop through them recursively
if (this.GetChildStrings(strParent).Count > 0) {
str.AppendLine(OPEN_LIST_ITEM_TAG + strParent);
GenerateHTML(str, this.GetChildStrings(strParent), iTabIndex + 2);
//add tabs for closing list item tag
this.AddTabs(str, iTabIndex + 1);
str.AppendLine(CLOSE_LIST_ITEM_TAG);
}
else {
//append opening and closing list item tags
str.AppendLine(OPEN_LIST_ITEM_TAG + strParent + CLOSE_LIST_ITEM_TAG);
}
}
//add tabs for closing list tag
this.AddTabs(str, iTabIndex);
//append closing list tag
str.AppendLine(CLOSE_LIST_TAG);
}
И отделить вкладку добавления в отдельный метод:
/// <summary>
/// Appends a number of tabs to the string builder
/// </summary>
/// <param name="str">The string builder to append to</param>
/// <param name="iTabIndex">The number of tabs to append to</param>
public void AddTabs(System.Text.StringBuilder str, int iTabIndex) {
for (int i = 0; i <= iTabIndex; i++) {
str.Append("\t");
}
}
Затем просто вызовите GenerateHTML с новым построителем строк, первый уровень строк и индекс табуляции, установленный в 0, и он должен дать вам то, что вы хотите. Я не включил функции, чтобы получить дочерние строки, поскольку я не был уверен, какую структуру вы используете для этого - дайте мне знать, и я смогу адаптировать свое решение.
Надеюсь, что это поможет, Dane.
Пожалуйста, добавьте код, который у вас есть на моменте. – Owen
Какую структуру вы используете для хранения строк (например, «Главная», «Кровати», «Столы» и т. Д.)? – link664