
Linq 和DefaultView两种方法去掉DataTable 里的重复行
发布日期:2021-05-09 04:30:24
浏览次数:20
分类:博客文章
本文共 5282 字,大约阅读时间需要 17 分钟。
在做项目的时候经常会遇到DataTable 里的数据重复,或者合并两个DataTable后有数据重复
一般我们是想把重复的删除掉,还有其它的方式实现比如用Linq和DataTable的DefaultView来去掉重复的行
做了一个小例子,很简单的大家可以看一下,最后有完整的代码
也可以直接下载工程:
先看一下效果
先写一个数据源
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{ #region IEqualityComparer 成员 public bool Equals(DataRow x, DataRow y) { return (x.Field ("id") == y.Field ("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{ #region IEqualityComparer 成员 public bool Equals(DataRow x, DataRow y) { return (x.Field ("id") == y.Field ("id")); } public int GetHashCode(DataRow obj) { return obj.ToString().GetHashCode(); } #endregion }}
工程:
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年03月24日 13时19分44秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
最通俗易懂的囚徒困境
2019-03-06
递推的思维构建与技巧实现
2019-03-06
五道逻辑思维题
2019-03-06
liteide错误: 进程无法启动--解决方法
2019-03-06
Java程序中的代理作用和应用场景及实现
2019-03-06
Java 前台后台数据传递、中文乱码解决方法
2019-03-06
Git报错:Permission denied (publickey)
2019-03-06
常见的图文布局
2019-03-06
Laravel - 上手实现 - 文件上传、保存到 public 目录下
2019-03-06
一次性搞懂 PHP 中面向对象的所有知识点。
2019-03-06
将mongo设置为windows的服务
2019-03-06
Linux 修改环境变量报错
2019-03-06
【Flink】Flink 底层RPC框架分析
2019-03-06
【集合框架】JDK1.8源码分析之LinkedList(七)
2019-03-06
【设计模式】策略模式
2019-03-06
【设计模式】命令模式
2019-03-06
Jenkins 集成postman 自动化运行接口测试用例
2019-03-06
hashlib 简单加密
2019-03-06
python装饰器实现对异常代码出现进行监控
2019-03-06