Linq 和DefaultView两种方法去掉DataTable 里的重复行
在做项目的时候经常会遇到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 } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构