有时候需要获取树形结构每一个节点的级次,以方便处理,最近也处理了一些这方面的问题,这里提供两个方法:使用SQLServer自定义函数和在C#中递归处理。
1、SQLServer 自定义函数
例子表结构
create table tb(id varchar(3) , pid varchar(3) , name varchar(10))
查询指定节点及其所有子节点的函数,修改下这个表值函数就可以满足你的需要了。
level就是节点的级次。
create function f_cid(@ID varchar(3)) returns @t_level table(id varchar(3) , level int) as begin ? declare @level int ? set @level = 1 ? insert into @t_level select @id , @level ? while @@ROWCOUNT > 0 ? begin ??? set @level = @level + 1 ??? insert into @t_level select a.id , @level ??? from tb a , @t_Level b ??? where a.pid = b.id and b.level = @level - 1 ? end ? return end
参考:http://topic.csdn.net/u/20091205/17/93630001-027f-4759-b27b-8397136030a3.html
2、在C#中
(1)使用递归
这里是用一个Project的类,需要换成自己的。
在合适的地方调用这个递归方法:InitTreeNodeGrade(0, 0);
private void InitTreeNodeGrade(int parentID, int grade) ??????? { ??????????? grade++;//级次加一 ??????????? foreach (Project objProject in projectList) ??????????? { //如果是当前节点的子级 ??????????????? if (objProject.ParentID == parentID) ??????????????? { //设置级次 ??????????????????? objProject.ProjectGrade = grade; //递归设置下级节点 ??????????????????? InitTreeNodeGrade(objProject.ProjectID, grade); ??????????????? } ??????????? } ??????? }
(2)非递归,使用栈和循环
Stack<Project> st = new Stack<Project>(); ??????????? st.Push(projectList[0]); ??????????? while (st.Count > 0) ??????????? { ??????????????? Project objProject = st.Pop(); ??????????????? foreach (Project objSubProject in projectList) ??????????????? { ??????????????????? if (objSubProject.ParentID == objProject.ProjectID) ??????????????????? { ??????????????????????? objSubProject.ProjectGrade = objProject.ProjectGrade + 1; ??????????????????????? st.Push(objSubProject); ??????????????????? } ??????????????? } ??????????? }
发表评论
相关文章
国内AI资源汇总,AI聊天、AI绘画、AI写作、AI视频、AI设计、AI编程、AI音乐等,国内顺畅访问,无需科学上网。
扫码或点击进入:萤火AI大全
文章分类
最新评论