跪求高手!帮忙优化一下【递归代码】速度太慢了!谢谢了

月之点点 2012-09-11 04:05:46
图片下面是源码~~~帮忙优化一下【递归代码】吧。。循环10此就要用0.4秒太慢了。。而且还不到50条数据。万一是2W条数据那岂不要卡死了~~~求帮忙~~~谢谢了



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;
}

...全文
558 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
ycproc 2012-09-13
  • 打赏
  • 举报
回复

这个结构还分页?
我真服了,你先把你想要什么搞清楚。

你是要一次性加载出来,你给谁看呢你?你知道一台计算机的屏幕有多大吗?你知道你这个家在出来了有几米吗?
是不是我百度的时候搜索出来了两百万个结果,然后他直接全部给我显示出来?他能吗?他能的话我看得了吗?
Ahoo 2012-09-13
  • 打赏
  • 举报
回复
表示楼主钻牛角尖了...
月之点点 2012-09-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

ajax+json 获取福级别 然后再福级别下获取该级别数据 , 返回的json有个可以json数据分页插件
[/Quote]

额~~我就只想优化一下递归代码而已··············其他的什么都不想~
xiedu414 2012-09-13
  • 打赏
  • 举报
回复
0.4秒?慢?你认为你把鼠标从屏幕左上角移动到正中间的点上需要多长时间?
xiedu414 2012-09-13
  • 打赏
  • 举报
回复
0.4秒?慢?你认为你把鼠标从屏幕左上角移动到正中间的点上需要多长时间?
xiedu414 2012-09-13
  • 打赏
  • 举报
回复
0.4秒?慢?你认为你把鼠标从屏幕左上角移动到正中间的点上需要多长时间?
月之点点 2012-09-13
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]
DataRow dr = dt.NewRow();
string[] sd = new string[dt.Columns.Count];
这些变量定义能放外面就放外面去

觉得楼主动向不明,递归就这样,根据条件减少下循环次数,也没什么好优化的,换个方向思考吧
[/Quote]
放在外面
dt.Rows.Add(dr);
是通不过的。。。
luhuiming741cs 2012-09-13
  • 打赏
  • 举报
回复
DataRow dr = dt.NewRow();
string[] sd = new string[dt.Columns.Count];
这些变量定义能放外面就放外面去

觉得楼主动向不明,递归就这样,根据条件减少下循环次数,也没什么好优化的,换个方向思考吧
月之点点 2012-09-13
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

表示楼主钻牛角尖了...
[/Quote]
不是这样的。。我就只是想要把 这个递归代码放在公用函数库里。以后只要有这样得我就用这个方法递归。不管递归多少条数据。。或者从中间递归。。我那里面传参数都有了。·····
我不是为了实现某一个功能而却优化他···如果是为了这样我我还不如放在缓存里····
所以我就是想优化一下递归代码···有可能以后会用到这个方法不是····

--------

主要是我嫌弃他真的很慢。小弟技术有限···
月之点点 2012-09-13
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]
这个结构还分页?
我真服了,你先把你想要什么搞清楚。

你是要一次性加载出来,你给谁看呢你?你知道一台计算机的屏幕有多大吗?你知道你这个家在出来了有几米吗?
是不是我百度的时候搜索出来了两百万个结果,然后他直接全部给我显示出来?他能吗?他能的话我看得了吗?
[/Quote]
不是这样的。。我就只是想要把 这个递归代码放在公用函数库里。以后只要有这样得我就用这个方法递归。不管递归多少条数据。。或者从中间递归。。我那里面传参数都有了。·····
我不是为了实现某一个功能而却优化他···如果是为了这样我我还不如放在缓存里····
所以我就是想优化一下递归代码···有可能以后会用到这个方法不是····
ask048478999 2012-09-12
  • 打赏
  • 举报
回复
ajax+json 获取福级别 然后再福级别下获取该级别数据 , 返回的json有个可以json数据分页插件
ask048478999 2012-09-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
无论数据量是多少,应当按需取数据

在加载数据的时候加载第一父级数据,在需要的时候通过select选择父级触发加载子级,依次类推
[/Quote]

用ajax+json实现 第一次获取父级别 父级别加载完成再加载子级别 这样省的你重复遍历
月之点点 2012-09-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
无论数据量是多少,应当按需取数据

在加载数据的时候加载第一父级数据,在需要的时候通过select选择父级触发加载子级,依次类推
[/Quote]
我就得先全部递归出来。。然后在分页···我就是想优化一下 递归代码。。实在是在慢了。。。能不能快100倍··
月之点点 2012-09-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
无论数据量是多少,应当按需取数据

在加载数据的时候加载第一父级数据,在需要的时候通过select选择父级触发加载子级,依次类推
[/Quote]
我就得先全部递归出来。。然后在分页···我就是想优化一下 递归代码。。实在是在慢了。。。能不能快100倍··
月之点点 2012-09-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
无论数据量是多少,应当按需取数据

在加载数据的时候加载第一父级数据,在需要的时候通过select选择父级触发加载子级,依次类推
[/Quote]

我的数据是 递归返回datatable 不一定用到树中。。有可能会用 列表中。。还带分页···
按需求加载就不现实了··带分页呢·
winner2050 2012-09-12
  • 打赏
  • 举报
回复
这也叫太慢啊,你不但递归数据,还递归绑定控件呢。

而且你还是用了低性能的查询方式,DataSet 速度不快,你还大量的拼接字符串。数据类型转换,能快吗?

而且绑定控件根本没必要每次都新建一个datatable,你都知道select 了还有必要新建一个?
ycproc 2012-09-12
  • 打赏
  • 举报
回复

无论数据量是多少,应当按需取数据

在加载数据的时候加载第一父级数据,在需要的时候通过select选择父级触发加载子级,依次类推
月之点点 2012-09-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

递归本身就慢……
两个思路 要么就缓存在内存里面 尽量少去查询
要么就更改数据格式(比如改双键环形树)
[/Quote]
主要是我写的这个递归慢的离谱啊~~循环10次 50条数据。。用了了0.4秒。太可怕了~
感觉50条数据 循环10次用掉0.004秒还算可以接受。。我写的这个慢100倍~~~更何况才50条数据。。那10W条数据会是什么情况。。递归一次黑天了···坚决优化···
g4_magicvr 2012-09-12
  • 打赏
  • 举报
回复
递归本身就慢……
两个思路 要么就缓存在内存里面 尽量少去查询
要么就更改数据格式(比如改双键环形树)
月之点点 2012-09-12
  • 打赏
  • 举报
回复
跪求高手解决~~~
加载更多回复(4)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧