日期:2014-05-18  浏览次数:20744 次

求Dataset.select的一个个高效率的算法
我最近在开发一个wince 5.0下的程序,用VS 2005 C#开发。
问题是这样的:
这个是我写的一个查询dataset的函数。这个函数搜索的效率比较低,虽然效率比较低,但搜索出来的结果却非常准确。
C# code
/// <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设备上运行,所以程序在执行起来比较缓慢。

下面是我改进过的算法:

C# code
/// <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;
            }
            
        }