以前合作做一个程序的时候,由于数据库设计原因。让我碰到了一个比较棘手的问题,就是最后我的数据Table里面存在了一行或多行重复行,那么怎么
删除这些重复行了。从网上找了许多材料,还是用了一个最笨的办法,把Table的行检索一遍把重复的行删除掉(在微软的社区里也有这样的例子)。最坏的情
况时间复杂度为o(行X列)。如果数据量比较小的话,这样的性能还可以忍受。但是数据量大的话。其速度也就不言而喻了。
检索部分代码如下:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1
publicDataTableSelectDistinct(DataTableSourceTable,stringFieldName)2


{3
DataTabledt=newDataTable();4
for(Int32i=0;i<SourceTable.Columns.Count;i++)5


{6
stringfieldName=SourceTable.Columns[i].Caption;7
dt.Columns.Add(fieldName,SourceTable.Columns[fieldName].DataType);8
}9

10
DataRowdataRow=dt.NewRow();11
foreach(DataRowdrinSourceTable.Select("",FieldName))12


{13
if(dataRow==null||!(ColumnEqual(dataRow[FieldName],dr[FieldName])))14


{15
dataRow=dr;16
DataRowrow=dt.NewRow();17
for(inti=0;i<dataRow.ItemArray.Length;i++)18


{19
row[i]=dataRow[i];20
}21
dt.Rows.Add(row);22
}23
}24
returndt;25
}上面的代码性能低。就不再多做剖析了。
下面来看看.Net提供的一个方法。个人认为还是比没有的好。只是多了一个转的过程起码自己不用再像上面所使用方法一行一行来找了。好了,言归正传。看下面的代码
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
privatevoidShowDataViewSource()

{
//Table
DataTabledataTable=newDataTable("dataTable");
DataColumndataColumn=newDataColumn("dataColumn");
DataColumndataColumn2=newDataColumn("dataType");
dataTable.Columns.Add(dataColumn);
dataTable.Columns.Add(dataColumn2);
DataRowdataRow;
for(inti=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并添加新的数据
DataViewdataView=newDataView(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
DataViewmyDataView=newDataView(dataTable);
string[]strComuns=
{"dataColumn","dataType"};
dg2.DataSource=myDataView.ToTable(true,strComuns);
}希望能帮到初学者。
本文介绍了解决.NET中DataTable出现重复数据的问题。通过两种方法实现:一种是手动逐行检查删除,但性能较低;另一种利用DataView的ToTable方法快速去除重复行。
3899

被折叠的 条评论
为什么被折叠?



