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
    }
}

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号