语言:C# 
平台:WEB 我现在用了3个FOR 分别生成HyperLink  大类,小类,详细类,这样实现了效果,可是速度慢的是一塌糊涂,请问这个应该怎么优化呢? for (int i = 0; i < proo.Select().Rows.Count; i++)
            {
                HyperLink hy = new HyperLink();                if (i == 0)
                {
                    hy.Text = proo.Select().Rows[i]["Name"].ToString() + "</BR>";                }
                else
                {
                    hy.Text = "</BR>" + "</BR>" + proo.Select().Rows[i]["Name"].ToString() + "</BR>";
                }                hy.CssClass = "reg111";
                Panel1.Controls.Add(hy);
                pro1.da = proo.Select().Rows[i]["Name"].ToString();
                for (int ix = 0; ix < proo1.Select().Rows.Count; ix++)
                {
                    if (proo1.Select().Rows[ix]["da"].ToString() == proo.Select().Rows[i]["Name"].ToString())
                    {
                        HyperLink hy1 = new HyperLink();
                        hy1.Text = proo1.Select().Rows[ix]["xiao"].ToString() + "</BR>";
                        hy1.CssClass = "menu";
                        Panel1.Controls.Add(hy1);                        for (int ixx = 0; ixx < proo2.Select().Rows.Count; ixx++)
                        {
                            if (proo2.Select().Rows[ixx]["xiao"].ToString() == proo1.Select().Rows[ix]["xiao"].ToString())
                            {
                                HyperLink hy12 = new HyperLink();
                                hy12.Text = proo2.Select().Rows[ixx]["xx"].ToString() + "</BR>";
                                hy12.CssClass = "bai12";
                                Panel1.Controls.Add(hy12);                            }                        }
                    }                }            }

解决方案 »

  1.   

    for 不多啊。直接这样就好。
      

  2.   

    3个for  而且都是在FOR里的,也就是说每个for都要循环3次, 而且数据很多
      

  3.   

    先把循环中的Select都提取出来,统一放到循环外面。这个题目好面熟...
      

  4.   


    循环外,如果Select()方法返回DataTable类型
    DataTable dt = proo1.Select();
      

  5.   

    是返回DataTable 型的,可是如果放在循环外就不能去一个一个的生成HyperLink,而是只生成一个全部的HyperLink,而且,二级FOR也没办法根据 一级FOR去查询每一个数据。
      

  6.   

    如果proo1是DataTable类型,Select返回的是一个DataRow数组,可以这样:
    DataRow [] drs=proo1.Select();
      

  7.   

    这么吧,你先确认一下,proo1是不是DataTable类型的吧。
      

  8.   

    proo
    proo1
    proo2
    都是DataTable类型的
      

  9.   

    proo 数据少
    proo1 数据较多
    proo2 数据多
      

  10.   


    DataRow[] drs_proo=proo.Select();
    DataRow[] drs_proo1=proo1.Select();
    DataRow[] drs_proo2=proo2.Select();for (int i = 0; i < drs_proo.Length; i++)
                {
                    HyperLink hy = new HyperLink();                if (i == 0)
                    {
                        hy.Text = drs_proo[i]["Name"].ToString() + "</BR>";                }
                    else
                    {
                        hy.Text = "</BR>" + "</BR>" + drs_proo[i]["Name"].ToString() + "</BR>";
                    }                hy.CssClass = "reg111";
                    Panel1.Controls.Add(hy);
                    pro1.da = drs_proo[i]["Name"].ToString();
                    for (int ix = 0; ix < drs_proo1.Length; ix++)
                    {
                        if (drs_proo1[ix]["da"].ToString() == drs_proo[i]["Name"].ToString())
                        {
                            HyperLink hy1 = new HyperLink();
                            hy1.Text = drs_proo1[ix]["xiao"].ToString() + "</BR>";
                            hy1.CssClass = "menu";
                            Panel1.Controls.Add(hy1);                        for (int ixx = 0; ixx < drs_proo2.Length; ixx++)
                            {
                                if (drs_proo2[ixx]["xiao"].ToString() == drs_proo1[ix]["xiao"].ToString())
                                {
                                    HyperLink hy12 = new HyperLink();
                                    hy12.Text = drs_proo2[ixx]["xx"].ToString() + "</BR>";
                                    hy12.CssClass = "bai12";
                                    Panel1.Controls.Add(hy12);                            }                        }
                        }                }            }
    你这样改改看。
      

  11.   

    虽然每次执行Select花费的时间不是特别多,但你的代码中这样的三重循环,在循环内重复执行Select,累计起来的时间就相当可观了,而且由于你的Select并没有使用条件,每次得到的结果都是一样的,所以,这样的重复执行根本就是没必要的。
      

  12.   

    这种多级通过实体类实现通过List<T>获取相关数据。
    用控件嵌套显示或遍历显示如reapter嵌套repater实现多级显示
      

  13.   

    我也理解个这个,三重循环每条数据都走3次循环在快的机器也的慢的不行,
     按照你的代码 无法将类型“System.Data.DataTable”隐式转换为“System.Data.DataRow[]”
    两种类型不是一样的?怎么解决下
      

  14.   

    这种遍历不可取,如果分四五级如何遍历获取。
    或用treeview或sitemap显示多级架构参考
      

  15.   

    DataRow[] dr=dt.Select("");查询获取行
      

  16.   

    那么这样说,你的proo未必是DataTable类型了?这个Select返回的是DataTable。DataTable drs_proo=proo.Select();
    DataTable drs_proo1=proo1.Select();
    DataTable drs_proo2=proo2.Select();for (int i = 0; i < drs_proo.Rows.Count; i++)
                {
                    HyperLink hy = new HyperLink();                if (i == 0)
                    {
                        hy.Text = drs_proo.Rows[i]["Name"].ToString() + "</BR>";                }
                    else
                    {
                        hy.Text = "</BR>" + "</BR>" + drs_proo.Rows[i]["Name"].ToString() + "</BR>";
                    }                hy.CssClass = "reg111";
                    Panel1.Controls.Add(hy);
                    pro1.da = drs_proo.Rows[i]["Name"].ToString();
                    for (int ix = 0; ix < drs_proo1.Rows.Count; ix++)
                    {
                        if (drs_proo1.Rows[ix]["da"].ToString() == drs_proo.Rows[i]["Name"].ToString())
                        {
                            HyperLink hy1 = new HyperLink();
                            hy1.Text = drs_proo1.Rows[ix]["xiao"].ToString() + "</BR>";
                            hy1.CssClass = "menu";
                            Panel1.Controls.Add(hy1);                        for (int ixx = 0; ixx < drs_proo2.Rows.Count; ixx++)
                            {
                                if (drs_proo2.Rows[ixx]["xiao"].ToString() == drs_proo1.Rows[ix]["xiao"].ToString())
                                {
                                    HyperLink hy12 = new HyperLink();
                                    hy12.Text = drs_proo2.Rows[ixx]["xx"].ToString() + "</BR>";
                                    hy12.CssClass = "bai12";
                                    Panel1.Controls.Add(hy12);                            }                        }
                        }                }            }
      

  17.   

    那可能是我说错了,
    proo 
    proo1 
    proo2 
    都是String类型的  返回是DataTable
      

  18.   

    不可能是string类型的,照现在的情况看,最大可能是一个什么自定义的类。