C# 去除DataTable表中重复行

去除DataTable表中重复行有两种方法:
sql

1、利用sql语句的distinct 关键字
如:select distinct * from table_name;
2、利用DataView.ToTable()方法
1.DataView.ToTable()c#

根据现有DataView中的行,建立并返回一个新的DataTable。数组

2.DataView.ToTable(String)ide

根据现有DataView中的行,建立并返回一个新的DataTable。参数String为返回的DataTable的名称,输出的表与输入表的列相通,不可自定义。spa

3.DataView.ToTable(Boolean,String[]).net

根据现有DataView中的行,建立并返回一个新的DataTable。参数Boolean若是为true,则去重,为false时不去重,且默认为false。code

可自定义返回的列,数组String[]为显示返回列的集合。blog

例子:排序

//去掉重复行DataTable dt = db.GetDataTable("select * from 表名"); //得到datatableDataView dv = dt.DefaultView;table = dv.ToTable(true, new string[] { "name", "code" });

public DataTable GetDataTable(string strSql)
{
try
{
//DataSet dataSet = new DataSet();
//SqlDataAdapter adapter = new SqlDataAdapter(strSql, _Connection);
//adapter.Fill(dataSet);
//return dataSet.Tables[0];
DataTable dt= new DataTable ();
SqlDataAdapter adapter = new SqlDataAdapter(strSql, _Connection);
adapter.Fill(dt);
return dt;
}
catch
{
return null;
}
}
索引

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

若是有一组数据(id不是惟一字段)

name code
张三 123
李四 123
张三 456
张三 123

经过上面的方法获得

name code
张三 123
李四 123
张三 456

4.DataView.ToTable(String,Boolean,String[])

根据现有DataView中的行,建立并返回一个新的DataTable。第一个参数string用来定义返回表的名称。

注意:想要的结果是只针对其中的一列去重,还要显示其余的列,怎么作

#region 删除DataTable重复列,相似distinct
        ///
        /// 删除DataTable重复列,相似distinct   
        ///
        ///DataTable
        ///字段名
        ///
        public static DataTable DeleteSameRow(DataTable dt, string Field)
        {
            ArrayList indexList = new ArrayList();
            // 找出待删除的行索引   
            for (int i = 0; i < dt.Rows.Count - 1; i++)
            {
                if (!IsContain(indexList, i))
                {
                    for (int j = i + 1; j < dt.Rows.Count; j++)
                    {
                        if (dt.Rows[i][Field].ToString() == dt.Rows[j][Field].ToString())
                        {
                            indexList.Add(j);
                        }
                    }
                }
            }
            indexList.Sort();
 // 排序
            for (int i = indexList.Count - 1; i >= 0; i--)// 根据待删除索引列表删除行  
            {
                int index = Convert.ToInt32(indexList[i]);
                dt.Rows.RemoveAt(index);
            }
            return dt;
        }    /// <summary>   
    /// 判断数组中是否存在   
    /// </summary>   
    /// <param name="indexList">数组</param>   
    /// <param name="index">索引</param>   
    /// <returns></returns>   
    public static bool IsContain(ArrayList indexList, int index)
    {
        for (int i = 0; i < indexList.Count; i++)
        {
            int tempIndex = Convert.ToInt32(indexList[i]);
            if (tempIndex == index)
            {
                return true;
            }
        }
        return false;
    }
    #endregion
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

借鉴文章:
一、C# DataTable去重,根据列名去重保留其余列
原文连接:https://blog.csdn.net/qq_23502409/article/details/75269221
二、C# 中怎样去除DataTable表里面的重复行
原文连接:https://blog.csdn.net/u010892197/article/details/50310907
三、c# DataView.ToTable() 方法 去除表中的重复项
原文连接:https://blog.csdn.net/JYL15732624861/article/details/61422332


注意:好比:DataTable dt=db.GetDataTable(“select * from 表名”); //得到datatableDataView dv = new DataView(dt);//对dt这个表建立一个视图(注意:这里的DataView只能对一个datatable进行建立视图)DataTable dt2 = dv.ToTable(true, “name“,”age“,”sex”);//true:true 去除重复,false 不去除; "name“,“age”,“sex”:表示须要显示的字段,特别注意:须要将每一个栏位用双引号括起来,否则会报错:列“name,age,sex”不属于基础表————————————————