关于如何删除DataTable中的重复行---使用.Net提供方法

以前合作做一个程序的时候,由于数据库设计原因。让我碰到了一个比较棘手的问题,就是最后我的数据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}

上面的代码性能低。就不再多做剖析了。
下面来看看.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后保留原有表中的哪些字段。字段名不区分大小写。
希望能帮到初学者。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值