找人 帮忙优化一下 递归算法。
  private void Display()
    {
        List<Book> listBook = BookBll.GetAllBook();
        foreach (Book book in listBook)
        {
            TreeNode TNode = new TreeNode(book.BName);
            this.tvTree.Nodes.Add(TNode);
            TNode.Target = book.BID.ToString();
            AddChile(TNode);
        }
    }    private void AddChile(TreeNode td)
    {
        List<BookInfo> listBookInfo = BookInfoBll.GetAllBookInfo(int.Parse(td.Target));
      
            foreach (BookInfo item in listBookInfo)
            {
                TreeNode tn = new TreeNode(item.Name);
                td.ChildNodes.Add(tn);
                tn.Target = item.ID.ToString();
                //递归调用
                AddChile(tn);
            }
    }
 List<BookInfo> listBookInfo = BookInfoBll.GetAllBookInfo(int.Parse(td.Target));
每次字表 递归 就连接数据库一次有没办法 优化一下。 只取一次 数据 在做递归?我现在 改成 一张表 字段如下(BookInfo表删除不要。) 
Bid 主键
Name 名字
ToId 对应的节点(Bid)如何 改进递归?

解决方案 »

  1.   

    如果只取一次,可以做如下更改
    private void Display()
        {
            List<Book> listBook = BookBll.GetAllBook(); //得到所有的数据
             
            foreach (Book book in listBook)
            {
                //取第一层的数据
                  if(book.Pid=="0") //假定父ID等于0
                {
                TreeNode TNode = new TreeNode(book.BName);
                this.tvTree.Nodes.Add(TNode);
                TNode.Target = book.BID.ToString();
                AddChile(TNode,listBook );
                }
            }
        }    private void AddChile(TreeNode td,List<BookInfo> listBook) 
        {
             foreach (BookInfo item in listBookInfo)
                {
                    if(item.Pid=td.Target.ToString())
                    {
                      TreeNode tn = new TreeNode(item.Name);
                       td.ChildNodes.Add(tn);
                      tn.Target = item.ID.ToString();
                     //递归调用
                        AddChile(tn,listBook);
                  }
                }
        }上面第一层节点的数据,及后面的数据楼主根据规则自己调整行了
      

  2.   

    List<Book> listBook 这个地方这样写怎么理解啊,问楼主
      

  3.   

    皮兜他爸那样写思路不错,不过有个语法错误:
    item.Pid=td.Target.ToString()
    很明显比较相等他误用了一个等号,应该两个等号,另外数据类型不一致也无法比较。
    应该这样:item.Pid.ToString() == td.Target.ToString()
      

  4.   


    不错,另外泛型之外还有一种递归方法,用DataTable.Select()方法,原理和Fibona类型,全取做递归
      

  5.   

    晕,他上面还有不少错误。
        private void AddChile(TreeNode td,List<Book> listBook) 
        {
             foreach (Book item in listBook)
                {
                    if(item.Pid.ToString() == td.Target.ToString())//Book类中有Pid吗?这里也只能猜测了。
                    {
                      TreeNode tn = new TreeNode(item.Name);
                      td.ChildNodes.Add(tn);
                      tn.Target = item.ID.ToString();
                     //递归调用
                        AddChile(tn,listBook);
                  }
                }
        }
      

  6.   

    修改后的代码。BID 主键
    BName 名字
    ToID 对应的节点(Bid) 
      private void Display()
        {
            List<Book> listBook = BookBll.GetAllBook();
            foreach (Book book in listBook)
            {
                if (book.ToID == 0) //假定父ID等于0
                {
                    TreeNode TNode = new TreeNode(book.BName);
                    this.tvTree.Nodes.Add(TNode);
                    TNode.Target = book.BID.ToString();
                    AddChield(TNode, listBook);
                }
            }
        }    private void AddChield(TreeNode td, List<Book> listBook)
        {
            foreach (Book item in listBook)
            {
                if (item.ToID == int.Parse(td.Target))
                {
                    TreeNode tn = new TreeNode(item.BName);
                    td.ChildNodes.Add(tn);
                    tn.Target = item.BID.ToString();
                    //递归调用
                    AddChield(tn, listBook);
                }
            }
        }感谢1楼给的思路!。