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
     }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值