关于如何删除DataTable中的重复行

2024-12-27 13:35:40
推荐回答(1个)
回答1:

以前合作做一个程序的时候,由于数据库设计原因。让我碰到了一个比较棘手的问题,就是最后我的数据Table里面存在了一行或多行重复行,那么怎么删除这些重复行了。从网上找了许多材料,还是用了一个最笨的办法,把Table的行检索一遍把重复的行删除掉(在微软的社区里也有这样的例子)。最坏的情况时间复杂度为o(行X列)。如果数据量比较小的话,这样的性能还可以忍受。但是数据量大的话。其速度也就不言而喻了。 检索部分代码如下: 1public DataTable SelectDistinct(DataTable SourceTable, string FieldName) 2 { 3 DataTable dt =new DataTable(); 4for (Int32 i =0; i < SourceTable.Columns.Count; i++) 5 { 6string fieldName=SourceTable.Columns[i].Caption; 7 dt.Columns.Add(fieldName, SourceTable.Columns[fieldName].DataType); 8 } 910 DataRow dataRow = dt.NewRow(); 11foreach (DataRow dr in SourceTable.Select("", FieldName)) 12 { 13if (dataRow ==null||!(ColumnEqual(dataRow[FieldName], dr[FieldName]))) 14 { 15 dataRow=dr; 16 DataRow row = dt.NewRow(); 17for (int i =0; i < dataRow.ItemArray.Length; i++) 18 { 19 row[i] = dataRow[i]; 20 } 21 dt.Rows.Add(row); 22 } 23 } 24return dt; 25 } 上面的代码性能低。就不再多做剖析了。 下面来看看.Net提供的一个方法。个人认为还是比没有的好。只是多了一个转的过程起码自己不用再像上面所使用方法一行一行来找了。好了,言归正传。看下面的代码 privatevoid ShowDataViewSource() { //Table DataTable dataTable =new DataTable("dataTable"); DataColumn dataColumn =new DataColumn("dataColumn"); DataColumn dataColumn2 =new DataColumn("dataType"); dataTable.Columns.Add(dataColumn); dataTable.Columns.Add(dataColumn2); DataRow dataRow; for (int i =0; i <10; i++) { dataRow = dataTable.NewRow(); dataRow["dataColumn"] ="item "+ i; if (i <7) { dataRow["dataType"] ="1"; } else { dataRow["dataType"] ="2"; } dataTable.Rows.Add(dataRow); } //将Table填充到DataView并添加新的数据 DataView dataView =new DataView(dataTable); //添加n行数据 dataRow = dataTable.NewRow(); dataRow["dataColumn"] ="World"; dataRow["dataType"] ="3"; dataTable.Rows.Add(dataRow); //在这里添加重复数据 dataRow = dataTable.NewRow(); dataRow["dataColumn"] ="martin"; dataRow["dataType"] ="1"; dataTable.Rows.Add(dataRow); dataRow = dataTable.NewRow(); dataRow["dataColumn"] ="martin"; dataRow["dataType"] ="1"; dataTable.Rows.Add(dataRow); dataRow = dataTable.NewRow(); dataRow["dataColumn"] ="martin"; dataRow["dataType"] ="1"; dataTable.Rows.Add(dataRow); dataRow = dataTable.NewRow(); dataRow["dataColumn"] ="martin"; dataRow["dataType"] ="1"; dataTable.Rows.Add(dataRow); //第一个数据源 dg1.DataSource = dataView; //去掉重复行的DataView DataView myDataView =new DataView(dataTable); string[] strComuns ={ "dataColumn", "dataType" }; dg2.DataSource = myDataView.ToTable(true, strComuns); } 主要做的工作就是把存在重复行数据的DataTable送给Dataview.然后使用DataView类的一个ToTable方法中的一个重载方法。就是上面用的,一共有两个参数,第一个bool类型参数就是指定装换成DataTable后是否保留重复行,第二个参数是一个字符串数组,用来指定转换成 DataTable后保留原有表中的哪些字段。字段名不区分大小写。