你可以先将存储过程提取出来的数据集按groupid生成三个DataTable(按照A,B,C),下面的示例代码你参考一下,我没有试验过。
private void GetAll()
{
//dts[]是三个DataTable的数组(按A,B,C先后)
DataTable[] dts[]=...
ArrayList al=new ArrayList();
al.Add(dts[0].Rows[0]);
foreach (DataTable dt in dts)
InsertDataRow(ref al,dt);
//得到的al就是满足条件的行的集合
}
private void InserDataRow(ref ArrayList al,DataTable dt)
{
int i=0;
foreach (DataRow dr in al)
{
bool hasRow=false;
for (;i<dt.Rows.Count;i++)
{
if (((int)dr[1]-(int)dt.Rows[i][1])*((int)dr[1]-(int)dt.Rows[i][1])+((int)dr[2]-(int)dt.Rows[i][2])*((int)dr[2]-(int)dt.Rows[i][2])>@const)
{
hasRow=true;break;
}
}
if (!hasRow)
{
al.Add(dt.Rows[0]);
return;
}
}
al.Add(dt.Rows[i]);
}
private void GetAll()
{
//dts[]是三个DataTable的数组(按A,B,C先后)
DataTable[] dts[]=...
ArrayList al=new ArrayList();
al.Add(dts[0].Rows[0]);
foreach (DataTable dt in dts)
InsertDataRow(ref al,dt);
//得到的al就是满足条件的行的集合
}
private void InserDataRow(ref ArrayList al,DataTable dt)
{
int i=0;
foreach (DataRow dr in al)
{
bool hasRow=false;
for (;i<dt.Rows.Count;i++)
{
if (((int)dr[1]-(int)dt.Rows[i][1])*((int)dr[1]-(int)dt.Rows[i][1])+((int)dr[2]-(int)dt.Rows[i][2])*((int)dr[2]-(int)dt.Rows[i][2])>@const)
{
hasRow=true;break;
}
}
if (!hasRow)
{
al.Add(dt.Rows[0]);
return;
}
}
al.Add(dt.Rows[i]);
}
private void InserDataRow(ref ArrayList al,DataTable dt)
{
bool hasRow=false;
ArrayList all=new ArrayList();
DataRow dr0=(DataRow)al[0];
//首先取得满足第一个条件的所有行
foreach (DataRow dr in dt.Rows)
{
if (((int)dr0[1]-(int)dr[1])*((int)dr0[1]-(int)dr[1])+((int)dr0[2]-(int)dr[2])*((int)dr0[2]-(int)dr[2])>@const)
{
hasRow=true;
all.Add(dr);
}
}
//如果没有满足条件的行,取第一行
if (!hasRow)
{
al.Add(dt.Rows[0]);
return;
}
//逐一判断以满足前一条件的行,不满足下一个条件就将它从all集合中除去
foreach (DataRow dr in al)
{
foreach (DataRow drr in all)
{
if (((int)dr[1]-(int)drr[1])*((int)dr[1]-(int)drr[1])+((int)dr[2]-(int)drr[2])*((int)dr[2]-(int)drr[2])<=@const)
all.RemoveAt(drr);
}
//判断集合all是否还有满足条件的行,如果没有就取第一行
if (all.Count==0)
{
al.Add(dt.Rows[0]);
return;
}
}
al.Add(all[0]);
}