1

Boxes を処理する MVC4 でアプリケーションを構築しています。Box には多くのボックスを含めることができ、Box を含めることもできます。メニューは次のようになります。

> Box 1
> Box 2
   > Box 2.A
   > Box 2.B
   > Box 2.C
      > Box 2.C.1
   > Box 2.D
> Box 3

現在、私は次のものを持っています:

public object GetTree(Box? box){

   foreach (var box in box.Boxes)
   {
       GetTree(box)
       // append menu item with box.name, box.id pair so a link can get generated
   }

私は少し立ち往生しています。メニューはオブジェクトとしてクライアントに渡され、リンクのツリー メニューとして表示されます。ここで最も適切なデータ構造はどれですか?

4

1 に答える 1

1

ここでは、再帰と適切なデータ構造について説明します。

つまり、ここでは再帰について説明します。あなたはすでにその方法で実装を始めているので、これは良いことです。

まず最初に。データ構造。メニューのようなツリーを表すには、好きなオブジェクトのようなツリーを作成する必要があるため、それらの単純なグラフを作成する必要があります。あなたは順調に始めました。オブジェクトがありBoxます。それを強化しましょう。BoxNode次のように、ボックスのリストを持つオブジェクトを作成します。

public class BoxNode
{
    public List<Box> BoxChildren 
    {
        get; set;
    }
}

次にBox

public class Box
{
    public string Name
    {
        get; set;
    }

    public BoxNode BoxNode
    {
        get; set;
    }
}

これで基本的なデータ構造ができました。関数に進みましょう。

    public static void CreateMenuTree(BoxNode boxNode, string indent)
    {
        foreach (Box box in boxNode.BoxChildren)
        {
            Console.WriteLine(indent + box.Name);

            if (box.BoxNode != null && box.BoxNode.BoxChildren != null && box.BoxNode.BoxChildren.Count > 0)
            {
                CreateMenuTree(box.BoxNode, indent + indent);
            }
        }
    }  

ここでは、完全に機能するコードも作成しました。この質問の要点コード*

もちろん、MVCシナリオでは、Console.WriteLineを適切なURLリンク生成に置き換え、ある種のCSSクラスでインデントすることに注意してください。しかし、私はあなたがポイントを取得する必要があると思います。

*これは製品コードではなく、デモコードであることに注意してください。

于 2013-03-10T10:04:34.277 に答える