解决方案 »
- 第三方gridview显示GIF图片(Developer Express )
- C# 结构数组查询当前值是否存在。
- windows service的问题
- 我的dotnet 环境出现了->符号怎么去掉?
- winfrom求大神指点下TabControl的问题
- 小白求指点迷津,我总有些乱七八糟的想法。
- 我怎样才能避免这样的错误Index was outside the bounds of the array.
- 怎样在OnKeyPress(object sender KeyPressEventArgs e)中响应功能键,如:F1...F12等.
- DateTimePicker控件为什么总是不能设置 checked = false
- 请介绍一本关于C#的好书!
- C#中结构体的内存大小与分配问题~求解
- SQL 2005 约束问题
先搞明白递归的概念
{
//这里垃圾回收一下,能不用的尽量回收,尽量避免堆栈溢出
GC.Collect();
...
}
DataSet ds2 = bll.GetList(" Paterid=" + Int32.Parse(ds.Tables[0].Rows[i]
这句该可以不要了,递归的时候,还会再调一遍,无意义,不用判断了,直接调
DropBind(Int32.Parse(ds.Tables[0].Rows[i]["id"].ToString()), droplist);
2. 如果可能,应该先处理那些预测堆栈深度较浅的分支,而不是较深的。
3. 尾递归应该立刻花1分钟时间断然改为迭代(即goto语句)。
4. 所有递归程序其实都可以通过形式化方式(用机器)改为迭代程序,在参数增加收集器就可以将递归逻辑改变。
public static void DropBind(int paterid, DropDownList droplist)
{
XXXCMS.BLL.NewsClassTable bll = new XXXCMS.BLL.NewsClassTable();
DataSet ds = bll.GetList(" Paterid=" + paterid + " and VersionColumn='cn'");
if (ds != null && ds.Tables[0].Rows.Count > 0 )
{
string depth = "";
for (int j = 0; j < Int32.Parse(ds.Tables[0].Rows[0]["depth"].ToString()); j++)
depth = depth + "|-";
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
ListItem list = new ListItem();
if (ds.Tables[0].Rows[i]["depth"].ToString() == "0")
{
list.Text = ds.Tables[0].Rows[i]["Title"].ToString();
}
else
{
list.Text = depth + ds.Tables[0].Rows[i]["Title"].ToString();
}
list.Value = ds.Tables[0].Rows[i]["id"].ToString();
droplist.Items.Add(list);
DropBind(Int32.Parse(ds.Tables[0].Rows[i]["id"].ToString()), droplist);
}
}
}
你的 XXXCMS.BLL.NewsClassTable 类.
请在方法最后一行释放掉它的 bll 实例.
或是自己用Stack类来创建一个栈模拟递归,这样绝对不会堆栈溢出。递归调用每次压栈的不止变量,还有函数调用信息。自己创建Stack<T>,这个是类,不会再栈上分配内存,所以不会堆栈溢出。
实例化变量尽量放在多次操作的外面