【问题标题】:path data to tree like data structure路径数据到树状数据结构
【发布时间】:2011-12-08 01:27:38
【问题描述】:

我有以下数据

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) 或生成用于 jquery 消费的 UL/Li。

我需要将其转换为返回正确层次结构的 List 类。到目前为止,我已经尝试了许多不同的方法,但我无法找到解决方案。我被困住了。我尝试在较早的帖子中询问,但解决方案没有奏效,经过多次尝试修改一些它只是简单地不起作用。我希望你们中的一个可以帮助我。

这也不是一个简单的拆分函数,我知道如何拆分字符串。

提前谢谢你

【问题讨论】:

标签: c# asp.net asp.net-mvc-3


【解决方案1】:

这是一个生成 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);

【讨论】:

  • 想知道我是否可以再打扰您一次,看看是否有办法在字典中也包含计数?让我们假设每一行都有一个文件数,将其添加到字典中有多容易??
  • @Vince:相当容易;将 FileCount 添加到 NodeEntry 类并将值传递给 AddEntry 方法。您需要将 AddEntry 方法更改为布尔类型的方法,并且仅在将新条目添加到集合中时才返回 true。然后,如果 oItem.Children.AddEntry 返回 false,请将 oItem 中的 FileCount 设置为您传入的 FileCount,因为这将是最后一项。
  • 谢谢,顾名思义,这是我得到的最好答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
相关资源
最近更新 更多