asp.net(C#)如何得出一个栏目的下级及下级的下级所有栏目?

来源:百度知道 编辑:UC知道 时间:2024/07/12 14:00:14
有一个无限级分类,
怎么得出一个栏目的下级分类的所有分类ID.
我是这样写的,但不是我要的结果:
protected static string getChildSort(int parentID,string strID)
{
DataTable dt = DBFun.GetClassList().Tables[0];
DataRow[] drs = dt.Select("ParentID= " + parentID);

foreach (DataRow dr in drs)
{
string classid = dr["id"].ToString();
strID = classid+","+strID;

getChildSort(Convert.ToInt32(classid), strID);
}
return strID;
}
只是得到栏目的下级,但下级的下级,再下级的下下级....得不到.
请怎么用递归怎么写.

先设个阀值,表示栏目树的最大层数(比如200),那么任何栏目的下级到目标栏目一定在[0,200]跳(parentID=parentID->parentID为一跳)能到达(不属于该栏目的下级永远不能通过parentID找到,因此跳数一定大于200)

只要遍历每个ID,取到parentId的跳步最大者的路径的倒置就是想要的结果。

该算法时间和空间复杂度都比较理想。如果栏目为二叉树,则时间复杂度O(nlogn),空间复杂度O(logn)

首先,在 C# 请不要用 “+” 拼接字符串,这样内存会产生很多垃圾。
应采用 StringBuilder sb, sb.Append("str") 方式。

protected static string getChildSort(int parentID,StringBuilder strID)
{
DataTable dt = DBFun.GetClassList().Tables[0];
DataRow[] drs = dt.Select("ParentID= " + parentID);

foreach (DataRow dr in drs)
{
string classid = dr["id"].ToString();
strID.Append(classid);
strID.Append(",");

getChildSort(Convert.ToInt32(classid), strID);
}
return strID.ToString();
}

注意 string 虽然是引用类型,但是赋值是重新拷贝过的。
dt重复创建不是好事(这个你自己优化)。

sta