跪求高手!帮忙优化一下【递归代码】速度太慢了!谢谢了
图片下面是源码~~~帮忙优化一下【递归代码】吧。。循环10此就要用0.4秒太慢了。。而且还不到50条数据。万一是2W条数据那岂不要卡死了~~~求帮忙~~~谢谢了
- C# code
protected void Page_Load(object sender, EventArgs e) { DataTable dt = "select id,name,Fid,LV from APP_Func".FSelect().FWhere("id<50 and LV<=4"); DateTime ww = DateTime.Now; for (int i = 0; i < 10; i++) { RecursiveClass(dt, 0, "fid", dt.Clone()).FRepeater(this.Repeater1); } Label1.Text = "循环【10】次的时间 " + ww.FTDiff(DateTime.Now).ToString() + " 秒,总共" + dt.Rows.Count + "条数据"; } /// <summary> /// [递归]无限级分类 /// </summary> /// <param name="ddtt">有数据的datatable</param> /// <param name="id">起初的ID</param> /// <param name="Fid">id=父类字段名</param> /// <param name="dt">返回的DT数据</param> /// <returns></returns> public DataTable RecursiveClass(DataTable data, int id, string Fid, DataTable dt) { for (int i = 0; i < data.Rows.Count; i++) { if (!(Select(dt, "id=" + id.ToString(), "").Rows.Count > 0) && id != 0) { dt = Select(data, "id=" + id.ToString(), ""); } if (int.Parse(data.Rows[i][Fid].ToString().Trim()) == id) { DataRow dr = dt.NewRow(); string[] sd = new string[dt.Columns.Count]; for (int j = 0; j < dt.Columns.Count; j++) { sd[j] = data.Rows[i][dt.Columns[j].ToString()].ToString(); } dr.ItemArray = sd; dt.Rows.Add(dr); RecursiveClass(data, int.Parse(data.Rows[i]["id"].ToString()), Fid, dt); } } return dt; } /// <summary> /// 执行DataTable中的查询返回新的DataTable /// </summary> /// <param name="dt">源数据DataTable</param> /// <param name="Where">查询条件【不需要加where】</param> /// <param name="Order">排序【不需要加Order by】</param> /// <returns>返回查询OK的DataTable</returns> public DataTable Select(DataTable dt, string Where, string Order) { DataTable newdt = new DataTable(); newdt = dt.Clone(); DataRow[] dr = dt.Select(Where, Order); for (int i = 0; i < dr.Length; i++) { newdt.ImportRow((DataRow)dr[i]); } return newdt; }
[解决办法]
可以尝试使用点击节点获取子节点的方法.
[解决办法]
递归本身就慢……
两个思路 要么就缓存在内存里面 尽量少去查询
要么就更改数据格式(比如改双键环形树)
[解决办法]
无论数据量是多少,应当按需取数据
在加载数据的时候加载第一父级数据,在需要的时候通过select选择父级触发加载子级,依次类推
[解决办法]
这也叫太慢啊,你不但递归数据,还递归绑定控件呢。
而且你还是用了低性能的查询方式,DataSet 速度不快,你还大量的拼接字符串。数据类型转换,能快吗?
而且绑定控件根本没必要每次都新建一个datatable,你都知道select 了还有必要新建一个?
[解决办法]
[解决办法]
ajax+json 获取福级别 然后再福级别下获取该级别数据 , 返回的json有个可以json数据分页插件
[解决办法]
表示楼主钻牛角尖了...
------解决方案--------------------
这个结构还分页?
我真服了,你先把你想要什么搞清楚。
你是要一次性加载出来,你给谁看呢你?你知道一台计算机的屏幕有多大吗?你知道你这个家在出来了有几米吗?
是不是我百度的时候搜索出来了两百万个结果,然后他直接全部给我显示出来?他能吗?他能的话我看得了吗?
[解决办法]
DataRow dr = dt.NewRow();
string[] sd = new string[dt.Columns.Count];
这些变量定义能放外面就放外面去
觉得楼主动向不明,递归就这样,根据条件减少下循环次数,也没什么好优化的,换个方向思考吧
[解决办法]
0.4秒?慢?你认为你把鼠标从屏幕左上角移动到正中间的点上需要多长时间?