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
}
}
|
工程:RemoveDupRowDemo.rar
本文转自lpxxn博客园博客,原文链接:http://www.cnblogs.com/li-peng/archive/2012/11/30/2795852.html,如需转载请自行联系原作者
Linq 和DefaultView两种方法去掉DataTable 里的重复行相关推荐
- php给点击的li设置样式,两种方法为LI列表前3行设置样式
两种方法为LI列表前3行设置样式 蓝叶 网站设计 2014-06-18 9789 10评论 在设计网页模板的时候,为了突出信息的重要性以及美观度,我们会设置一些样式使LI文章列 ...
- 如何去掉DataTable中的重复行(新增.net 2.0中最新解决方法---简便)
.net 1.1中的解决方法(转) 1建立一个DataSetHelper类(DataSetHelper.cs) public class DataSetHelper ...{ public D ...
- centos 7安装matlab的两种方法(桌面安装和命令行安装)
matlab安装说明 安装之前一直以为命令行安装(静默安装)完就是命令行界面,安装成功后才发现还是有桌面的,还跟桌面安装的一模一样.所以,个人建议对linux不太熟悉的还是用桌面版安装,虽然会有点卡顿 ...
- VB中FSO的调用的两种方法
方法一: Dim objFso Set objFso = CreateObject("Scripting.FileSystemObject") ...
- AIX更改逻辑卷属性的两种方法(smit和命令行)
起因:mklv 时忘记指定-t 参数导致TYPE默认为RAW(应该是raw), p550a:/dev#lslv data40_disk LOGICAL VOLUME: data40_disk ...
- 【转】【Asp.Net】Asp.net发送邮件的两种方法小结
这几天看了一下Asp.net发送邮件方面的东西,记得之前的IIS6上有SMTP服务器,可以直接利用这个进行邮件发送,现在的开发环境是Windows 7,找了半天没有找到,到网络上查了才知道原来wind ...
- Asp.net发送邮件的两种方法小结
这几天看了一下Asp.net发送邮件方面的东西,记得之前的IIS6上有SMTP服务器,可以直接利用这个进行邮件发送,现在的开发环境是Windows 7,找了半天没有找到,到网络上查了才知道原来wind ...
- Android Studio导入Eclipse项目的两种方法
Android Studio导入Eclipse项目有两种方法,一种是直接把Eclipse项目导入Android Studio,另一种是在Eclipse项目里面进行转换,然后再导入Android Stu ...
- Hexo自定义页面的两种方法
原文地址:http://refined-x.com/2017/07/10/Hexo自定义页面的方法/. Hexo是静态页博客生成利器,同很多博主一样,前端路上原创技术博客也是使用Hexo生成并托管在G ...
最新文章
- leetcode算法题--除数博弈★
- python爬虫论文摘要怎么写_Python爬虫基础教学(写给入门的新手)
- a*算法matlab代码_MATLAB数学建模算法的代码模板大全
- 每日英语:Is austerity good for your health?
- 1Password 7:Mac的密码管理工具
- Java网络编程——客户端Socket
- SWFObject Flash 增强插件
- 涉密计算机清退登记表,涉密载体登记表.doc
- Python-开根号的几种方式
- 使用Python实现消息轰炸
- 【BZOJ 3097】 Hash Killer I
- 鸽巢排序Pigeonhole Sort----(排序算法八)
- hive reduce
- 良好的代码习惯(一)
- 算法分析之常用符号大O、小o、大Ω符号、大Θ符号、w符号
- DIY信号发生器:运放实现三角波、方波发生器(详细参数说明)+multisim仿真
- 远程桌⾯连接电脑后键盘失灵解决方案
- Vuex的响应式原理
- 信息系统安全实验——Week 8
- 【ceph】AsyncMessenger 网络模块总结--编辑中
热门文章
- JAVA基础学习day25--Socket基础二-多线程
- 如何设置cout的输出格式(转)
- 一个电脑安装多个系统的几个办法
- html透明度_iMac下制作含透明度图片及判断图片透明度
- 互联网系统架构的演进
- 《『若水新闻』客户端开发教程》——08.设计新闻回复UI
- 在python中单线程,多线程,多进程对CPU的利用率实测以及GIL原理分析
- php 上传大文件主要涉及配置upload_max_filesize和post_max_size两个选项
- 追踪盗窃12亿用户登录数据的网络犯罪团伙
- 2016将是网络勒索之年 攻击变得更“个人化”