遍历DataTable时移除某些行

来源:互联网 发布:faceu软件下载 编辑:程序博客网 时间:2024/05/17 01:59

最近用到一个功能,遍历一个表,找出满足条件的数据,插入另一张表,并当前表中的行,避免重复插入且优化系统性能。

例如:一个表包含BelongName,MarketProjectID,Year,Month,要从这个表中找板块1在2012年的工程数量,示例如下:

为了节约资源及优化代码,在循环中就要移除已获取记录的行,所以这里用到三张表,一张源数据复制表(内层循环:确保所有数据都要被遍历到),一张源数据表(外围循环表,记录被移除行后的最新源数据表),一张结果表(用于记录所需要的最终结果)。

/// <summary>        /// 获取空表        /// </summary>        /// <returns></returns>        private DataTable GetNullDt()        {            DataTable dtResultNull = new DataTable();            dtResultNull.Columns.Add("Name");            dtResultNull.Columns.Add("Num");            dtResultNull.Columns.Add("Ratio");            dtResultNull.PrimaryKey = new DataColumn[] { dtResultNull.Columns["Name"] };  //建立主键,按月度查询时需避免插入重复键            return dtResultNull;        }



 

/// <summary>        /// 获取绑定数据        /// 获取累计行及比例        /// </summary>        /// <returns></returns>        private DataTable GetRatio(DataTable dtBase)        {            DataTable dtResult=GetNullDt();//最终结果表            decimal total = 0;            DataTable dtGet = dtBase.Copy();            for (int i = 0; i < dtBase.Rows.Count; i++)//外层循环:源数据表,已被记录的行不在遍历,优化性能避免重复            {                string name = dtBase.Rows[i]["Name"].ToString();                decimal Num = 0;                DataRow drNew = dtResult.NewRow();                              for (int j = 0; j < dtGet.Rows.Count; j++)   //内层循环:源数据复制表,用于记录所有数据,确保每条记录都会被遍历                {                    DataRow dr = dtGet.Rows[j];                    DataRow drBase = dtBase.Rows[0];                    drBase.ItemArray = dr.ItemArray;                    if (dr["Name"].ToString().Equals(name))                    {
                        if (!dtResult.Rows.Contains(name))   //判断结果表是否已包含该板块                        {                            Num++;                        }                     dtBase.Rows.Remove(drBase);   //移除源数据表中被记录的行                          dtBase.AcceptChanges();                    }                }if (!dtResult.Rows.Contains(name))                {                drNew["Name"] = name;                drNew["Num"] = Num;                dtResult.Rows.Add(drNew);                total += Num;}            }            if (total > 0)            {                foreach (DataRow drResult in dtResult.Rows)                {                    if (!string.IsNullOrEmpty(drResult["Num"].ToString()))                    {                        drResult["Ratio"] =Math.Round( Convert.ToDecimal(drResult["Num"]) / total*100,2);                    }                }            }            if (dtResult.Rows.Count > 0)            {                DataRow drTotal = dtResult.NewRow();                drTotal["Name"] = "小计";                drTotal["Num"] = total;                drTotal["Ratio"] = "100";                dtResult.Rows.Add(drTotal);            }            return dtResult;        }