在做项目的时候经常会遇到DataTable 里的数据重复,或者合并两个DataTable后有数据重复
一般我们是想把重复的删除掉,还有其它的方式实现比如用Linq和DataTable的DefaultView来去掉重复的行
做了一个小例子,很简单的大家可以看一下,最后有完整的代码
也可以直接下载工程:RemoveDupRowDemo.rar
先看一下效果
先写一个数据源
DataTable _dt = new DataTable();
_dt.Columns.Add("id", typeof(int));
_dt.Columns.Add("name", typeof(string));
_dt.Columns.Add("address", typeof(string));
DataRow _dr = _dt.NewRow();
_dr["id"] = 1;
_dr["name"] = "lipeng";
_dr["address"] = "DongXiaoKou";
_dt.Rows.Add(_dr);
_dt.Rows.Add(_dr.ItemArray);
_dt.Rows.Add(_dr.ItemArray);
_dr = _dt.NewRow();
_dr["id"] = 2;
_dr["name"] = "xiaoNa";
_dr["address"] = "DongXiaoKou";
_dt.Rows.Add(_dr);
_dr = _dt.NewRow();
_dr["id"] = 3;
_dr["name"] = "BingLi";
_dr["address"] = "TianTongYuan";
_dt.Rows.Add(_dr);
_dt.Rows.Add(_dr.ItemArray);
Console.WriteLine("--------------------原来有重复数据的Table----------------------");
_dt.AsEnumerable().ToList().ForEach(
x =>
{
Console.WriteLine(x["id"].ToString() + " " + x["name"].ToString() + " " + x["address"].ToString());
});
Console.WriteLine();
先用Linq的Distinct方法实现,因为每行有好多列,要实现IEqualityComparer<T>接口
public
class
DataTableRowCompare : IEqualityComparer<DataRow>
{
#region IEqualityComparer<DataRow> 成员
public
bool
Equals(DataRow x, DataRow y)
{
return
(x.Field<
int
>(
"id"
) == y.Field<
int
>(
"id"
));
}
public
int
GetHashCode(DataRow obj)
{
return
obj.ToString().GetHashCode();
}
#endregion
}
|
在Main里实现 吧
Console.WriteLine(
"--------------------用Linq去重复后的Table----------------------"
);
var
_comPresult = _dt.AsEnumerable().Distinct(
new
DataTableRowCompare());
DataTable _resultDt = _comPresult.CopyToDataTable();
_resultDt.AsEnumerable().ToList().ForEach(
x =>
{
Console.WriteLine(x[
"id"
].ToString() +
" "
+ x[
"name"
].ToString() +
" "
+ x[
"address"
].ToString());
});
Console.WriteLine();
|
用Table里的DefalutView实面DefalutView有个ToTable方法可以做到去重复
Console.WriteLine(
"--------------------用DefaultView去重复后的Table----------------------"
);
DataTable _dtDefalut = _dt.DefaultView.ToTable(
true
,
"id"
,
"name"
,
"address"
);
_dtDefalut.AsEnumerable().ToList().ForEach(
x =>
{
Console.WriteLine(x[
"id"
].ToString() +
" "
+ x[
"name"
].ToString() +
" "
+ x[
"address"
].ToString());
});
Console.ReadLine();
|
个人感觉 还是Linq的好一点,用DefaultView如果你的列少的话还好些,如果列太多的话工作量就太大了
下面给一下完整的代码
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
System.Data;
namespace
RemoveDupRowDemo
{
class
Program
{
static
void
Main(
string
[] args)
{
DataTable _dt =
new
DataTable();
_dt.Columns.Add(
"id"
,
typeof
(
int
));
_dt.Columns.Add(
"name"
,
typeof
(
string
));
_dt.Columns.Add(
"address"
,
typeof
(
string
));
DataRow _dr = _dt.NewRow();
_dr[
"id"
] = 1;
_dr[
"name"
] =
"lipeng"
;
_dr[
"address"
] =
"DongXiaoKou"
;
_dt.Rows.Add(_dr);
_dt.Rows.Add(_dr.ItemArray);
_dt.Rows.Add(_dr.ItemArray);
_dr = _dt.NewRow();
_dr[
"id"
] = 2;
_dr[
"name"
] =
"xiaoNa"
;
_dr[
"address"
] =
"DongXiaoKou"
;
_dt.Rows.Add(_dr);
_dr = _dt.NewRow();
_dr[
"id"
] = 3;
_dr[
"name"
] =
"BingLi"
;
_dr[
"address"
] =
"TianTongYuan"
;
_dt.Rows.Add(_dr);
_dt.Rows.Add(_dr.ItemArray);
Console.WriteLine(
"--------------------原来有重复数据的Table----------------------"
);
_dt.AsEnumerable().ToList().ForEach(
x =>
{
Console.WriteLine(x[
"id"
].ToString() +
" "
+ x[
"name"
].ToString() +
" "
+ x[
"address"
].ToString());
});
Console.WriteLine();
Console.WriteLine(
"--------------------用Linq去重复后的Table----------------------"
);
var
_comPresult = _dt.AsEnumerable().Distinct(
new
DataTableRowCompare());
DataTable _resultDt = _comPresult.CopyToDataTable();
_resultDt.AsEnumerable().ToList().ForEach(
x =>
{
Console.WriteLine(x[
"id"
].ToString() +
" "
+ x[
"name"
].ToString() +
" "
+ x[
"address"
].ToString());
});
Console.WriteLine();
Console.WriteLine(
"--------------------用DefaultView去重复后的Table----------------------"
);
DataTable _dtDefalut = _dt.DefaultView.ToTable(
true
,
"id"
,
"name"
,
"address"
);
_dtDefalut.AsEnumerable().ToList().ForEach(
x =>
{
Console.WriteLine(x[
"id"
].ToString() +
" "
+ x[
"name"
].ToString() +
" "
+ x[
"address"
].ToString());
});
Console.ReadLine();
}
}
public
class
DataTableRowCompare : IEqualityComparer<DataRow>
{
#region IEqualityComparer<DataRow> 成员
public
bool
Equals(DataRow x, DataRow y)
{
return
(x.Field<
int
>(
"id"
) == y.Field<
int
>(
"id"
));
}
public
int
GetHashCode(DataRow obj)
{
return
obj.ToString().GetHashCode();
}
#endregion
}
}
|