以前合作做一个程序的时候,由于数据库设计原因。让我碰到了一个比较棘手的问题,就是最后我的数据Table里面存在了一行或多行重复行,那么怎么 删除这些重复行了。从网上找了许多材料,还是用了一个最笨的办法,把Table的行检索一遍把重复的行删除掉(在微软的社区里也有这样的例子)。最坏的情 况时间复杂度为o(行X列)。如果数据量比较小的话,这样的性能还可以忍受。但是数据量大的话。其速度也就不言而喻了。
检索部分代码如下:
1public DataTable SelectDistinct(DataTable SourceTable, string FieldName)
2 {
3 DataTable dt = new DataTable();
4 for (Int32 i = 0; i < SourceTable.Columns.Count; i++)
5 {
6 string fieldName=SourceTable.Columns[i].Caption;
7 dt.Columns.Add(fieldName, SourceTable.Columns[fieldName].DataType);
8 }
9
10 DataRow dataRow = dt.NewRow();
11 foreach (DataRow dr in SourceTable.Select("", FieldName))
12 {
13 if (dataRow == null || !(ColumnEqual(dataRow[FieldName], dr[FieldName])))
14 {
15 dataRow=dr;
16 DataRow row = dt.NewRow();
17 for (int i = 0; i < dataRow.ItemArray.Length; i++)
18 {
19 row[i] = dataRow[i];
20 }
21 dt.Rows.Add(row);
22 }
23 }
24 return dt;
25 }
上面的代码性能低。就不再多做剖析了。
下面来看看.Net提供的一个方法。个人认为还是比没有的好。只是多了一个转的过程起码自己不用再像上面所使用方法一行一行来找了。好了,言归正传。看下面的代码
private void 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);
}
希望能帮到初学者。