日期:2014-05-17  浏览次数:20477 次

跪求高手!帮忙优化一下【递归代码】速度太慢了!谢谢了
图片下面是源码~~~帮忙优化一下【递归代码】吧。。循环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 了还有必要新建一个?
------解决方案--------------------
探讨
无论数据量是多少,应当按需取数据

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

------解决方案--------------------
ajax+json 获取福级别 然后再福级别下获取该级别数据 , 返回的json有个可以json数据分页插件
------解决方案--------------------
表示楼主钻牛角尖了...
------解决方案--------------------