一种方法,很好使,又快:
Dictionary<level1,Dictionary<level2,Dictionary<level3,List<level4>>>>
伪码:
foreach(DataRow dr in DataTable.Rows)
{
string level1 = dr[0].ToString();
string level2=dr[1].ToString();
string level3 = dr[2].ToString();
string level4 = dr[3].ToString();
if(dicLevel1.ContainsKey(level1))
{
//把字典提出来,然后加入
}
else
{
//新建个字典
}
}
示意为止,能明白吧,不明白接着问我。就是用字典组成棵树。查树的数据也相当快。
个人感觉 使用递归算法
递归是必须的,就是如何去做呢 呵呵
@Good_Luck:
做过树形菜单么? 你需要定义好条件。
1 protected void BingBookNaiget(int pid, TreeNode pNode) 2 { 3 //请用递归方法理解 4 5 List<Category> list = CategoryManagers.GetCategoriesByPId(pid); 6 if (list != null) 7 { 8 foreach (Category item in list) 9 { 10 TreeNode node = new TreeNode(); 11 node.Value = item.PId.ToString(); 12 node.NavigateUrl = ResolveUrl("~/Book/list.aspx") + "?pid=" + pid; 13 node.Text = item.Name; 14 if (pid == 0) 15 { 16 //添加父节点 17 bookNaiget.Nodes.Add(node); 18 // bookNaiget.Nodes.Add(new TreeNode("ddd|")); 19 20 } 21 else 22 { 23 //添加子节点 24 pNode.ChildNodes.Add(node); 25 26 } 27 BingBookNaiget(item.Id, node); 28 } 29 } 30 31 }
这是代码剩下的 需要你自己了
--drop table #Tmp create table #Tmp ( id int, level1 varchar(5), level2 varchar(5), level3 varchar(5), level4 varchar(5) ); insert into #Tmp select 1,'A','B','C','D' insert into #Tmp select 2,'A','F','C','D' insert into #Tmp select 3,'B','C','F','D' select * from #Tmp select newstr from ( select ''+level1 as newstr,id, 1 as orderid from #Tmp union all select '----'+level2, id,2 as orderid from #Tmp union all select '--------'+level3,id, 3 as orderid from #Tmp union all select '------------'+level4,id, 4 as orderid from #Tmp )t order by id,orderid --truncate table #Tmp
表的部分我加了个id
不知道你的数据表有没有id字段,或者其它能体现顺序的。不然下面没法排序。
数据库为什么设计成这样?用一个字段来标记父节点不行吗?
我觉得你可以考虑一下两种方式:
1、ID,PID字段,这种方式使用递归方式获取,可以支持非常多的节点
2、使用编码长度规则表+内容表,这种方式使用定长编码规则,好处是速度非常快,适合类别不多,但是明细很多的。