你可以先将存储过程提取出来的数据集按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]);
}

解决方案 »

  1.   

    抱歉,回来看了看,发现了问题,将InserDataRow改成:
    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]);
    }