找人 帮忙优化一下 递归算法。
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)如何 改进递归?
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)如何 改进递归?
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);
}
}
}上面第一层节点的数据,及后面的数据楼主根据规则自己调整行了
item.Pid=td.Target.ToString()
很明显比较相等他误用了一个等号,应该两个等号,另外数据类型不一致也无法比较。
应该这样:item.Pid.ToString() == td.Target.ToString()
不错,另外泛型之外还有一种递归方法,用DataTable.Select()方法,原理和Fibona类型,全取做递归
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);
}
}
}
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楼给的思路!。