我最近在开发一个wince 5.0下的程序,用VS 2005 C#开发。
问题是这样的:
这个是我写的一个查询dataset的函数。这个函数搜索的效率比较低,虽然效率比较低,但搜索出来的结果却非常准确。
/// <summary>
        ///根据条件查询是否有在指定范围内的记录
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="c"></param>
        /// <returns></returns>
        private DataRow[] Select_(double a,double b,double c)
        {
            try
            {
                double Big_b_FW = b + 0.006;
                double Big_a_FW = a + 0.006;
                double Small_b_FW = b - 0.006;
                double Small_a_FW = a - 0.006;
                double Big_c_FW = c + 50.0;
                double Small_c_FW = c - 50.0;                DataRow[] dr = DS_PointInfo.Tables[0].Select("a < " + Big_a_FW.ToString() + "And a > " + Small_a_FW.ToString() + "AND b > " + Small_b_FW.ToString() + "AND b < " + Big_b_FW.ToString() + "AND c < " + Big_c_FW.ToString() + "AND c > " + Small_c_FW.ToString());
                return dr;            }
            catch(Exception err)
            {
                MessageBox.Show(err.ToString());
                return null;
            }
            
        }
上面这个算法效率比较低,但搜索结果却非常准确,由于是在WINCE设备上运行,所以程序在执行起来比较缓慢。下面是我改进过的算法:/// <summary>
        ///根据条件查询是否有在指定范围内的记录
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="c"></param>
        /// <returns></returns>
        private DataRow[] Select_JWD(double a,double b,double c)
        {
            try
            {
                double Big_a_FW = a + 0.006;
                double Small_a_FW = a - 0.006;
                double Big_b_FW = b + 0.006;
                double Small_b_FW = b - 0.006;
                double Big_c_FW = c + 50.0;
                double Small_c_FW = c - 50.0;
                DataRow[] dr = DS.Tables[0].Select("b > " + Small_b_FW.ToString() + " AND b < " + Big_b_FW.ToString());
                if (dr.Length > 0)
                {
                    DataTable DATAT = new DataTable();
                    DATAT = DS.Tables[0].Clone();
                    for (int i = 0; i < dr.Length; i++)
                    {
                        DATAT.Rows.Add(dr[i].ItemArray);
                    }
                    DataRow[] dr1 = DATAT.Select("a > " + Small_a_FW.ToString() + " AND a < " + Big_a_FW.ToString());
                    if (dr1.Length > 0)
                    {
                        DATAT.Rows.Clear();
                        DATAT = DS.Tables[0].Clone();
                        for (int i = 0; i < dr.Length; i++)
                        {
                            DATAT.Rows.Add(dr[i].ItemArray);
                        }
                        DataRow[] dr2 = DATAT.Select("c > " + Small_c_FW.ToString() + " AND c < " + Big_c_FW.ToString());
                        return dr2;
                    }
                    else
                    {
                        return dr1;
                    }
                }
                else
                {
                    return dr;
                }
            }
            catch(Exception err)
            {
                MessageBox.Show(err.ToString());
                return null;
            }
            
        }这个这个算法效率似乎要高一些,但经常查询出一些错误的结果,比如本来不在此范围之内的记录都被查询出来了,这个是什么原因。希望高手能指点一下,请大家帮帮忙。我的希望是既能有比较高的效率,但结果又要能够很准确,请问这个算法该如何改进,谢谢指点。对于你的回复,小弟不胜感激,谢谢。

解决方案 »

  1.   

    第二个函数算法有问题
     if (dr.Length > 0)
                    {
                        DataTable DATAT = new DataTable();
                        DATAT = DS.Tables[0].Clone();
                        for (int i = 0; i < dr.Length; i++)
                        {
                            DATAT.Rows.Add(dr[i].ItemArray);
                        }
                        DataRow[] dr1 = DATAT.Select("a > " + Small_a_FW.ToString() + " AND a < " + Big_a_FW.ToString());
                        if (dr1.Length > 0)
                        {
                            DATAT.Rows.Clear();
                            DATAT = DS.Tables[0].Clone();
                            for (int i = 0; i < dr.Length; i++)
                            {
                                DATAT.Rows.Add(dr[i].ItemArray);
                            }
                            DataRow[] dr2 = DATAT.Select("c > " + Small_c_FW.ToString() + " AND c < " + Big_c_FW.ToString());
                            return dr2;
                        }
                        else
                        {
                            return dr1;
                        }
                    }
                    else
                    {
                        return dr;
                    }你的需求是满足所有条件,怎么能把只满足部分条件的返回去呢,比如
      

  2.   

    忘了说怎么解决的了,那就是我执行select的datatable名字写错了,所以出了点问题,这个小问题困扰我很久了,下次一定要注意了。
      

  3.   

    各位有空去看看我其他问题吗,麻烦各位了。http://topic.csdn.net/u/20080720/02/33a72cda-a457-48cf-967b-c1e1f4a34aef.htmlhttp://topic.csdn.net/u/20080718/10/6fbf126f-7512-4eaa-986b-ef8a7753d8f4.html只要能给点提示,小弟马上分数奉上。