我最近在开发一个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;
}
}这个这个算法效率似乎要高一些,但经常查询出一些错误的结果,比如本来不在此范围之内的记录都被查询出来了,这个是什么原因。希望高手能指点一下,请大家帮帮忙。我的希望是既能有比较高的效率,但结果又要能够很准确,请问这个算法该如何改进,谢谢指点。对于你的回复,小弟不胜感激,谢谢。
问题是这样的:
这个是我写的一个查询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;
}
}这个这个算法效率似乎要高一些,但经常查询出一些错误的结果,比如本来不在此范围之内的记录都被查询出来了,这个是什么原因。希望高手能指点一下,请大家帮帮忙。我的希望是既能有比较高的效率,但结果又要能够很准确,请问这个算法该如何改进,谢谢指点。对于你的回复,小弟不胜感激,谢谢。
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;
}你的需求是满足所有条件,怎么能把只满足部分条件的返回去呢,比如