данные пути к древовидной структуре данных - PullRequest
0 голосов
/ 08 декабря 2011

у меня есть следующие данные

root
root/blue
root/blue/temp
root/main
root/main/dev
root/main/back
root/etc/init
root/etc/init/dev
root/etc/init/test
root/etc/init/back
root/etc/init/server
root/etc/init/system
root/etc/init/setup
root/system
root/system/temp1
root/system/temp2
root/system/temp3
root/system/temp4
root/system/temp5
root/system/temp5/dev1
root/rel
root/intel/archival
root/intel/archival/newsreel
root/intel/archival/recording

Я хотел бы иметь возможность использовать класс либо для привязки данных к элементу управления деревом (ASP.Net), либо для генерации UL / Li для потребления jquery.

Мне нужно преобразовать его в класс List, который будет возвращать правильную иерархию. До сих пор я пробовал много разных подходов, и я не могу найти решение. Я застрял. Я пытался спросить в предыдущем посте, но решение не сработало, после многих попыток изменить некоторые из них просто не работает. Я надеюсь, что один из вас может помочь мне.

Также это не простая функция разбиения, я знаю, как разбить строку.

Заранее спасибо

1 Ответ

2 голосов
/ 08 декабря 2011

Вот решение, которое генерирует вложенный словарь элементов NodeEntry:

public class NodeEntry
{
    public NodeEntry()
    {
        this.Children = new NodeEntryCollection();
    }

    public string Key { get; set; }
    public NodeEntryCollection Children { get; set; }

}

public class NodeEntryCollection : Dictionary<string, NodeEntry>
{
    public void AddEntry(string sEntry, int wBegIndex)
    {
        if (wBegIndex < sEntry.Length)
        {
            string sKey;
            int wEndIndex;

            wEndIndex = sEntry.IndexOf("/", wBegIndex);
            if (wEndIndex == -1)
            {
                wEndIndex = sEntry.Length;
            }
            sKey = sEntry.Substring(wBegIndex, wEndIndex - wBegIndex);
            if (!string.IsNullOrEmpty(sKey)) {
                NodeEntry oItem;

                if (this.ContainsKey(sKey)) {
                    oItem = this[sKey];
                } else {
                    oItem = new NodeEntry();
                    oItem.Key = sKey;
                    this.Add(sKey, oItem);
                }
                // Now add the rest to the new item's children
                oItem.Children.AddEntry(sEntry, wEndIndex + 1);
            }
        }
    }
}

Чтобы использовать вышеизложенное, создайте новую коллекцию:

        NodeEntryCollection cItems = new NodeEntryCollection();

затем для каждой строки в вашем списке:

        cItems.AddEntry(sLine, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...