在做项目的时候经常会遇到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 里的重复行相关推荐

  1. php给点击的li设置样式,两种方法为LI列表前3行设置样式

    两种方法为LI列表前3行设置样式 蓝叶    网站设计    2014-06-18    9789    10评论 在设计网页模板的时候,为了突出信息的重要性以及美观度,我们会设置一些样式使LI文章列 ...

  2. 如何去掉DataTable中的重复行(新增.net 2.0中最新解决方法---简便)

    .net 1.1中的解决方法(转) 1建立一个DataSetHelper类(DataSetHelper.cs) public class DataSetHelper ...{     public D ...

  3. centos 7安装matlab的两种方法(桌面安装和命令行安装)

    matlab安装说明 安装之前一直以为命令行安装(静默安装)完就是命令行界面,安装成功后才发现还是有桌面的,还跟桌面安装的一模一样.所以,个人建议对linux不太熟悉的还是用桌面版安装,虽然会有点卡顿 ...

  4. VB中FSO的调用的两种方法

    方法一:   Dim   objFso      Set   objFso   =   CreateObject("Scripting.FileSystemObject")    ...

  5. AIX更改逻辑卷属性的两种方法(smit和命令行)

    起因:mklv 时忘记指定-t 参数导致TYPE默认为RAW(应该是raw), p550a:/dev#lslv data40_disk LOGICAL VOLUME:     data40_disk ...

  6. 【转】【Asp.Net】Asp.net发送邮件的两种方法小结

    这几天看了一下Asp.net发送邮件方面的东西,记得之前的IIS6上有SMTP服务器,可以直接利用这个进行邮件发送,现在的开发环境是Windows 7,找了半天没有找到,到网络上查了才知道原来wind ...

  7. Asp.net发送邮件的两种方法小结

    这几天看了一下Asp.net发送邮件方面的东西,记得之前的IIS6上有SMTP服务器,可以直接利用这个进行邮件发送,现在的开发环境是Windows 7,找了半天没有找到,到网络上查了才知道原来wind ...

  8. Android Studio导入Eclipse项目的两种方法

    Android Studio导入Eclipse项目有两种方法,一种是直接把Eclipse项目导入Android Studio,另一种是在Eclipse项目里面进行转换,然后再导入Android Stu ...

  9. Hexo自定义页面的两种方法

    原文地址:http://refined-x.com/2017/07/10/Hexo自定义页面的方法/. Hexo是静态页博客生成利器,同很多博主一样,前端路上原创技术博客也是使用Hexo生成并托管在G ...

最新文章

  1. leetcode算法题--除数博弈★
  2. python爬虫论文摘要怎么写_Python爬虫基础教学(写给入门的新手)
  3. a*算法matlab代码_MATLAB数学建模算法的代码模板大全
  4. 每日英语:Is austerity good for your health?
  5. 1Password 7:Mac的密码管理工具
  6. Java网络编程——客户端Socket
  7. SWFObject Flash 增强插件
  8. 涉密计算机清退登记表,涉密载体登记表.doc
  9. Python-开根号的几种方式
  10. 使用Python实现消息轰炸
  11. 【BZOJ 3097】 Hash Killer I
  12. 鸽巢排序Pigeonhole Sort----(排序算法八)
  13. hive reduce
  14. 良好的代码习惯(一)
  15. 算法分析之常用符号大O、小o、大Ω符号、大Θ符号、w符号
  16. DIY信号发生器:运放实现三角波、方波发生器(详细参数说明)+multisim仿真
  17. 远程桌⾯连接电脑后键盘失灵解决方案
  18. Vuex的响应式原理
  19. 信息系统安全实验——Week 8
  20. 【ceph】AsyncMessenger 网络模块总结--编辑中

热门文章

  1. JAVA基础学习day25--Socket基础二-多线程
  2. 如何设置cout的输出格式(转)
  3. 一个电脑安装多个系统的几个办法
  4. html透明度_iMac下制作含透明度图片及判断图片透明度
  5. 互联网系统架构的演进
  6. 《『若水新闻』客户端开发教程》——08.设计新闻回复UI
  7. 在python中单线程,多线程,多进程对CPU的利用率实测以及GIL原理分析
  8. php 上传大文件主要涉及配置upload_max_filesize和post_max_size两个选项
  9. 追踪盗窃12亿用户登录数据的网络犯罪团伙
  10. 2016将是网络勒索之年 攻击变得更“个人化”