Linq 和DefaultView两种方法去掉DataTable 里的重复行

在做项目的时候经常会遇到DataTable 里的数据重复,或者合并两个DataTable后有数据重复

一般我们是想把重复的删除掉,还有其它的方式实现比如用Linq和DataTable的DefaultView来去掉重复的行

做了一个小例子,很简单的大家可以看一下,最后有完整的代码

也可以直接下载工程:RemoveDupRowDemo.rar

先看一下效果

Linq 和DefaultView两种方法去掉DataTable 里的重复行

先写一个数据源

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

你可能感兴趣的:(Datatable)