ADO.NET DataSet、DataTable、DataRow、DataView的学习

对于一个datatable中的数据进行嵌套查询判断某几列数据是否相同从而确定这条数据是否一样,并确定他重复的次数COUNT1字段。

例如: DataTable dt = new DataTable();

        dt.Columns.Add("NAME", System.Type.GetType("System.String"));
        dt.Columns.Add("SEX", System.Type.GetType("System.String"));
        dt.Columns.Add("BIRTHDAY", System.Type.GetType("System.String"));
        dt.Columns.Add("BIRPLACE", System.Type.GetType("System.String"));

       dt.Columns.Add("COUNT1", System.Type.GetType("System.Int32"));

假设一个dsBA数据集中包含很多信息,不乏有几行重复的数据

循环dsBA给dt加入数据

 for (int i = 0; i < dsBA.Tables[0].Rows.Count; i++)
        {
            DataRow dr = dt.NewRow();
            dr["NAME"] = dsBA.Tables[0].Rows[i]["NAME"];
            dr["SEX"] = dsBA.Tables[0].Rows[i]["SEX"];
            dr["BIRTHDAY"] = dsBA.Tables[0].Rows[i]["BIRTHDAY"];
            dr["BIRPLACE"] = dsBA.Tables[0].Rows[i]["BIRPLACE"];
            dr["COUNT1"] = 1;//初始化不管
            dt.Rows.Add(dr);
        }

那么对dt的排序操作如下:(必须先对dt排序)

#region 操作dt
       //首先对dt要按名称排序这样有利于内层循环做判断
        dt.DefaultView.Sort = "NAME asc";
        DataTable dt2 = dt.DefaultView.ToTable();

        DataTable dtCopy = dt2.Clone();
        //判断dt中数据人员四项是否有相同的的,如果有相同的则代表同一个人,
        //如果次数大于1则保存该人员信息和总计次数,并输出结果
        int count = 1;//定义count保存重复的次数,确定人员出访次数
        bool flag = false;//是否结束内存循环和内层循环是否结束
        for (int i = 0; i < dt2.Rows.Count; i++)
        {
            count = 1;
            string  name1 = dt2.Rows[i]["NAME"].ToString();
            string sex1 = dt2.Rows[i]["SEX"].ToString();
            string birthday1 = dt2.Rows[i]["BIRTHDAY"].ToString();
            string birplace1 = dt2.Rows[i]["BIRPLACE"].ToString();
            for (int j = i+1; j < dt2.Rows.Count; j++)
            {
                string name2 = dt2.Rows[j]["NAME"].ToString();
                string sex2 = dt2.Rows[j]["SEX"].ToString();
                string birthday2 = dt2.Rows[j]["BIRTHDAY"].ToString();
                string birplace2 = dt2.Rows[j]["BIRPLACE"].ToString();
                if (name1 == name2 && sex1 == sex2 && birplace1 == birplace2 && birthday1 == birthday2)
                {
                    count++;//次数加1
                    flag = true;//继续循环
                    continue;  //
                }
                else
                {
                    flag = false;//表示没有相同的
                    break;//推出本层循环继续外围循环
                }
            }
            if (count > 1&&flag==false)
            {
                DataRow dr = dtCopy.NewRow();
                dr["NAME"] = dt2.Rows[i]["NAME"];
                dr["SEX"] = dt2.Rows[i]["SEX"];
                dr["BIRTHDAY"] = dt2.Rows[i]["BIRTHDAY"];
                dr["BIRPLACE"] = dt2.Rows[i]["BIRPLACE"];     
                dr["COUNT1"] = count;
                dtCopy.Rows.Add(dr);
            }
            i = i + count;//从不重复的位置开始继续进行外层循环
        }
        #endregion

 

posted @ 2015-04-02 16:35  码农小小强  阅读(266)  评论(0编辑  收藏  举报