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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏hbbliyong

排序含有数字的字符串:一个巧妙地方法

using System; using System.Collections.Generic; class Program { static voi...

2764
来自专栏*坤的Blog

hdu1000

1533
来自专栏GIS讲堂

C#中获取系统时间

7462
来自专栏c#开发者

make Entity Framework revert empty strings to null!

public override int SaveChanges(SaveOptions options)         {             forea...

2836
来自专栏跟着阿笨一起玩NET

ASP.NET常用导出Excel方法汇总

本文转载:http://mattberseth.com/blog/2007/04/export_gridview_to_excel_1.html

4732
来自专栏C/C++基础

C#获取系统当前时间

ystem.DateTime currentTime=new System.DateTime(); 1.1 取当前年月日时分秒 currentTime=Sy...

1573
来自专栏.net core新时代

List,DataTable实现行转列的通用方案

  最近在做报表统计方面的需求,涉及到行转列报表。根据以往经验使用SQL可以比较容易完成,这次决定挑战一下直接通过代码方式完成行转列。期间遇到几个问题和用到的新...

2317
来自专栏码农阿宇

C# 获取一个独一无二的字符串 GUID

在保存文件,创建目录时,为了保证名称不重复,经常使用Random产生一个随机数,有更简单且不会重复的办法是: Guid.NewGuid().ToString()...

26510
来自专栏菩提树下的杨过

DataTable排序结果的纠正

默认情况下,即便db中某一列的值是数字,查询出来的DataSet/DataTable里,Column的类型都是String型,所以当用dataTable.Def...

2099
来自专栏跟着阿笨一起玩NET

把DataTable 转换成Json格式,适用于EasyUI 绑定DataGrid

本文转载:http://www.cnblogs.com/liang--liang/archive/2013/02/05/2893030.html

1272

扫码关注云+社区

领取腾讯云代金券