以前合作做一个程序的时候,由于数据库设计原因。让我碰到了一个比较棘手的问题,就是最后我的数据Table里面存在了一行或多行重复行,那么怎么 删除这些重复行了。从网上找了许多材料,还是用了一个最笨的办法,把Table的行检索一遍把重复的行删除掉(在微软的社区里也有这样的例子)。最坏的情 况时间复杂度为o(行X列)。如果数据量比较小的话,这样的性能还可以忍受。但是数据量大的话。其速度也就不言而喻了。
检索部分代码如下:
筛选掉重复行
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1publicDataTableSelectDistinct(DataTableSourceTable,stringFieldName)
2{
3DataTabledt=newDataTable();
4for(Int32i=0;i<SourceTable.Columns.Count;i++)
5{
6stringfieldName=SourceTable.Columns[i].Caption;
7dt.Columns.Add(fieldName,SourceTable.Columns[fieldName].DataType);
8}
9
10DataRowdataRow=dt.NewRow();
11foreach(DataRowdrinSourceTable.Select("",FieldName))
12{
13if(dataRow==null||!(ColumnEqual(dataRow[FieldName],dr[FieldName])))
14{
15dataRow=dr;
16DataRowrow=dt.NewRow();
17for(inti=0;i<dataRow.ItemArray.Length;i++)
18{
19row[i]=dataRow[i];
20}
21dt.Rows.Add(row);
22}
23}
24returndt;
25}
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1publicDataTableSelectDistinct(DataTableSourceTable,stringFieldName)
2{
3DataTabledt=newDataTable();
4for(Int32i=0;i<SourceTable.Columns.Count;i++)
5{
6stringfieldName=SourceTable.Columns[i].Caption;
7dt.Columns.Add(fieldName,SourceTable.Columns[fieldName].DataType);
8}
9
10DataRowdataRow=dt.NewRow();
11foreach(DataRowdrinSourceTable.Select("",FieldName))
12{
13if(dataRow==null||!(ColumnEqual(dataRow[FieldName],dr[FieldName])))
14{
15dataRow=dr;
16DataRowrow=dt.NewRow();
17for(inti=0;i<dataRow.ItemArray.Length;i++)
18{
19row[i]=dataRow[i];
20}
21dt.Rows.Add(row);
22}
23}
24returndt;
25}
上面的代码性能低。就不再多做剖析了。
下面来看看.Net提供的一个方法。个人认为还是比没有的好。只是多了一个转的过程起码自己不用再像上面所使用方法一行一行来找了。好了,言归正传。看下面的代码
使用DataView的自动筛选功能
<!--<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);
}
主要做的工作就是把存在重复行数据的DataTable送给Dataview.然后使用DataView类的一个ToTable方法中的一个重载方法。就 是上面用的,一共有两个参数,第一个bool类型参数就是指定装换成DataTable后是否保留重复行,第二个参数是一个字符串数组,用来指定转换成 DataTable后保留原有表中的哪些字段。字段名不区分大小写。
<!--<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);
}
希望能帮到初学者。