0
| Level1      | Level2               | Level3       | Level4|

| ELECTRONICS | TELEVISIONS          | NULL         | NULL  |

| ELECTRONICS | TELEVISIONS          | LCD          | NULL  |

| ELECTRONICS | PC                   | NULL         | NULL  |

| ELECTRONICS | PORTABLE ELECTRONICS | MP3 PLAYERS  | FLASH |

| ELECTRONICS | PORTABLE ELECTRONICS | CD PLAYERS   | NULL  |

| ELECTRONICS | PORTABLE ELECTRONICS | 2 WAY RADIOS | NULL  |

レガシーデータベースにはこのテーブルがあり、それを素敵な階層html ul liリストに出力しようとしています。ここでスタックオーバーフローでさまざまな回答を試みて、C# でオブジェクトを構築しましたが、それらにはすべてparentID と childID があり、この場合はうまくいきません。

私はこのコードを試していますが、それが本当に悪いことを理解しています.

    List<Node> FlatToHierarchy(IList<SearchWord> list)
    {
        List<Node> nodes = new List<Node>();

        foreach (SearchWord x in list)
        {
            if (x.Level2 != " " && x.Level3 == " ")
            {
                Node node = new Node();
                node.Parent = x.Level1;
                node.Child = x.Level2;
                node.Keyword = x.Keyword;
                nodes.Add(node);
                //dict.Add(node.Parent, node);
            }

            if (x.Level3 != " " && x.Level4 == " ")
            {
                Node node = new Node();
                node.Parent = x.Level2;
                node.Child = x.Level3;
                node.Keyword = x.Keyword;
                nodes.Add(node);
                //dict.Add(node.Parent, node);
            }

            if (x.Level4 != " ")
            {
                Node node = new Node();
                node.Parent = x.Level3;
                node.Child = x.Level4;
                node.Keyword = x.Keyword;
                nodes.Add(node);
                //dict.Add(node.Parent, node);
            }
        }

        return nodes;
    }
4

2 に答える 2

1

真の階層を構築するclass Nodeには、クラスにサブアイテムが必要です。メソッドだけでなく、データにも階層が含まれるように追加List<Node>します。次に、html li/ul リストを作成できます。たとえば、クラスは次のようになります。NodeAddNode

public class Node
{
    public string Name { get; set; } // Current node name
    public string Parent { get; set; }
    public string Keyword { get; set; }
    public int Level { get; set; } // Optional

    private List<Node> _children = new List<Node>();
    public List<Node> Children { get { return _children; } }

    public Node AddChild(Node child)
    {
        _children.Add(child);
        return this;
    }   
}

Parentまたは、ノードへの参照を作成できます。

public class Node
{
    public Node Parent { get; set; }
    public string ParentName { get { Parent != null ? Parent.Name : null; } }
    // ...
}

次に、html の li/ul リストを作成するために、Node 構造を再帰的に繰り返します。

編集: 実際、考えてみると、データから階層的な XML ドキュメントを構築したいだけかもしれません。次に、xml から ul/li を作成できます。

public class Data
{
    public string Level1 { get; set; }
    public string Level2 { get; set; }
    public string Level3 { get; set; }
    public string Level4 { get; set; }
}

public Data[] sampleData = new Data[] {
    new Data { Level1 = "ELECTRONICS", Level2 = "TELEVISIONS", Level3 = null, Level4 = null },
    new Data { Level1 = "ELECTRONICS", Level2 = "TELEVISIONS", Level3 = "LCD", Level4 = null },
    new Data { Level1 = "ELECTRONICS", Level2 = "PC", Level3 = null, Level4 = null },
    new Data { Level1 = "ELECTRONICS", Level2 = "PORTABLE ELECTRONICS", Level3 = "MP3 PLAYERS", Level4 = "FLASH" },
    new Data { Level1 = "ELECTRONICS", Level2 = "PORTABLE ELECTRONICS", Level3 = "CD PLAYERS", Level4 = null },
    new Data { Level1 = "ELECTRONICS", Level2 = "PORTABLE ELECTRONICS", Level3 = "2 WAY RADIOS", Level4 = null },
};

XElement AddNode(string name)
{
    return new XElement("Node", 
        new XAttribute("Name", name));
}

// NOTE: This is not optimized, but you get the idea...
XDocument BuildHierarchy(IEnumerable<Data> data)
{
    XElement root = new XElement("Root");
    XDocument xdoc = new XDocument(root);
    XElement level1 = null;
    XElement level2 = null;
    XElement level3 = null;
    XElement level4 = null;

    foreach (var item in data)
    {
        // Assumes item.Level1 is never empty...
        if (level1 == null || string.Compare(item.Level1, level1.Attribute("Name").Value) != 0)
        {
            level1 = AddNode(item.Level1);
            root.Add(level1);
            level2 = null;
            level3 = null;
            level4 = null;
        }

        if (string.IsNullOrWhiteSpace(item.Level2))
        {
            level2 = null;
            level3 = null;
            level4 = null;
            continue;
        }

        if (level2 == null || string.Compare(item.Level2, level2.Attribute("Name").Value) != 0)
        {
            level2 = AddNode(item.Level2);
            level1.Add(level2);
            level3 = null;
            level4 = null;
        }

        if (string.IsNullOrWhiteSpace(item.Level3))
        {
            level2 = null;
            level3 = null;
            level4 = null;
            continue;
        }

        if (level3 == null || string.Compare(item.Level3, level3.Attribute("Name").Value) != 0)
        {
            level3 = AddNode(item.Level3);
            level2.Add(level3);
            level4 = null;
        }

        if (string.IsNullOrWhiteSpace(item.Level4))
        {
            level4 = null;
            continue;
        }

        if (level4 == null || string.Compare(item.Level4, level4.Attribute("Name").Value) != 0)
        {
            level4 = AddNode(item.Level4);
            level3.Add(level4);
        }
    }

    return xdoc;
}
于 2012-11-07T15:14:46.123 に答える
0

このテーブルを行のコレクションに取り、各列で行をグループ化しますが、それは最終的に得たいデータ構造によって異なります。

必要なのが HTML の階層リストだけで、それが 4 列しかない場合はLevel1Level2、 、Level3でソートされたデータベース クエリを実行してから、Level4それらをループします。インジケーターを保持して、レベルが変化したかどうかを確認し、必要に応じて HTML コードを出力します。

于 2012-11-07T14:37:13.280 に答える