c# 快速去掉DataTable 内容中 前后空格

一直一来Data Table 都是For 循环一条条,一个一个Column的的For 下去进行 Trim,
发现这个做法非常非常影响效率,只要DataTable里面有1000条记录,然后Column超过 20条个,
Format的Trim的效率就非常慢。

 #region 以下的处理空格的效率太慢
            try
            {
                for (int k = 0; k < oldDTable.Rows.Count; k++)
                {
                    Application.DoEvents();
                    for (int j = 0; j < oldDTable.Columns.Count; j++)
                    {
                        Application.DoEvents();
                        switch (oldDTable.Columns[j].DataType.Name)
                        {
                            case "Decimal": //数字型0置为空                        
                                /*
                                 * 数字为0 ,是一个真实的存在,不能去掉为 DBNull
                                if (oldDTable.Rows[k][j] != null && Decimal.TryParse(oldDTable.Rows[k][j].ToString(), out decimalResult) && (Decimal)(oldDTable.Rows[k][j]) == 0)
                                    oldDTable.Rows[k][j] = DBNull.Value;
                                */

                                if (oldDTable.Rows[k][j] != null)
                                    oldDTable.Rows[k][j] = oldDTable.Rows[k][j].ToString().Trim();

                                break;
                            case "String": //字符型去空
                                if (oldDTable.Rows[k][j] != null)
                                    oldDTable.Rows[k][j] = oldDTable.Rows[k][j].ToString().Trim();

                                break;
                            case "DateTime"://日期类型
                                /*
                                 * 日期1970-01-01,是一个真实的存在,不能去掉为 DBNull
                                if (((DateTime)(oldDTable.Rows[k][j])).ToString("yyyy-MM-dd") == "1970-01-01")
                                    oldDTable.Rows[k][j] = DBNull.Value;
                                */

                                break;
                        }
                    }
                }
            }
            catch { }

            return oldDTable;
            #endregion

 

-----偶然发现,可以使用表达式
newCol.Expression = "trim([" + pCol.ColumnName + "])";

于是想到可以利用newDTRes.DefaultView.ToTable(false, columnList); 和上面的做法进行结合,快速处理出 去掉内容前后空白的做法。

1)Copy 新Column标记_forJB
2)  View to Table 到新DataTable
3)  新DataTable 去掉标记_forJB回到最初的DataTable结构。

上最终函数,使用的时候记得备注来源 jawance@126.com,方面我在虚拟世界里面立个flag,thanks.


        DataColumn BuildDataColumn(DataColumn pCol, bool pIsTrim)
        {
            DataColumn newCol = new DataColumn();
            newCol.DataType = pCol.DataType;

            if (pIsTrim)
            {
                newCol.ColumnName = pCol.ColumnName + _BuildColumnKey;
                if (pCol.DataType.Name != "Decimal")
                {
                    newCol.Expression = "trim([" + pCol.ColumnName + "])";
                }
            }
            else
            {
                newCol.ColumnName = pCol.ColumnName + _BuildColumnKey;
                newCol.Expression = pCol.ColumnName;
            }

            return newCol;
        }

        DataColumn BuildRestoreDataColumn(DataColumn pCol)
        {
            DataColumn newCol = new DataColumn();
            newCol.DataType = pCol.DataType;
            if (pCol.ColumnName.Contains(_BuildColumnKey))
            {
                newCol.ColumnName = pCol.ColumnName.Replace(_BuildColumnKey, "");
            }
            newCol.Expression = pCol.ColumnName;

            return newCol;
        }

        Dictionary<string, DataColumn> dicColl = new Dictionary<string, DataColumn>();
        Dictionary<string, DataColumn> dicAllColl = new Dictionary<string, DataColumn>();
        /// <summary>
        /// 上面的属性开放 Enabled DataGrid Format 有处理这个情况,开放属性就就可以了
        /// </summary>
        /// <param name="pDt"></param>
        public DataTable TrimValueForOutPut(ref DataTable pDt)
        {

            DataTable newDtFinal = null;

            if (pDt == null)
                return newDtFinal;

            try
            {
                Utils.ShowWaitDialog();
                int colIndex = 0;
                string[] columnList = new string[] { };
                string columnListStr = "";

                if (dicColl.Count == 0)
                {
                    //Init 
                    foreach (DataColumn col in pDt.Columns)
                    {
                        string key = string.Format("{0}_{1}", colIndex, col.ColumnName);
                        if (col.DataType.Name == "Decimal"
                            || col.DataType.Name == "String")
                        {
                            if (!dicColl.ContainsKey(key))
                            {
                                dicColl.Add(key, col);

                            }
                        }
                    }

                    //All 
                    DataColumn[] Coll = new DataColumn[] { };
                    foreach (DataColumn col in pDt.Columns)
                    {
                        string key = string.Format("{0}_{1}", colIndex, col.ColumnName);
                        dicAllColl.Add(key, col);
                        //columnIndex++;                        
                    }
                }

                DataTable newDt = pDt.Copy();

                foreach (var col in dicAllColl)
                {
                    if (dicColl.ContainsKey(col.Key))
                    {
                        newDt.Columns.Add(BuildDataColumn(col.Value, true));
                        columnListStr += col.Value.ColumnName + _BuildColumnKey + ";";
                    }
                    else
                    {
                        newDt.Columns.Add(BuildDataColumn(col.Value, false));
                        columnListStr += col.Value.ColumnName + _BuildColumnKey + ";";
                    }
                }

                columnList = columnListStr.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                DataTable newDt2 = newDt.DefaultView.ToTable(false, columnList);

                columnListStr = "";
                DataTable newDTRes = newDt2.Copy();
                foreach (DataColumn col in newDt2.Columns)
                {
                    newDTRes.Columns.Add(BuildRestoreDataColumn(col));
                    columnListStr += col.ColumnName.Replace(_BuildColumnKey, "") + ";";
                }


                columnList = columnListStr.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                newDtFinal = newDTRes.DefaultView.ToTable(false, columnList);

                if (newDtFinal != null && newDtFinal.Rows.Count == pDt.Rows.Count)
                {
                    //this.dtSource = newDtFinal;
                    //this.DataSource = newDtFinal;
                    //SetDataSource = newDtFinal;
                    pDt = newDtFinal;
                    //pDt = null;
                }

                Utils.CloseWaitDialog();
                return newDtFinal;
            }
            catch
            {
                Utils.CloseWaitDialog();
                return newDtFinal;
            }


        }

 

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页