C# 去除DataTable表中重复行

https://blog.csdn.net/weixin_41561640/article/details/106133842

去除DataTable表中重复行有两种方法:
一、利用sql语句的distinct 关键字
如:select distinct * from table_name;
二、利用DataView.ToTable()方法
1.DataView.ToTable()

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

2.DataView.ToTable(String)

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

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

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

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

例子:

//去掉重复行
DataTable dt = db.GetDataTable("select * from 表名"); //获得datatable
DataView 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不是唯一字段)

namecode
张三123
李四123
张三456
张三123

通过上面的方法得到

namecode
张三123
李四123
张三456

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

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

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

#region 删除DataTable重复列,类似distinct
        /// <summary>   
        /// 删除DataTable重复列,类似distinct   
        /// </summary>   
        /// <param name="dt">DataTable</param>   
        /// <param name="Field">字段名</param>   
        /// <returns></returns>   
        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;
        }
    <span class="token comment">/// &lt;summary&gt;   </span>
    <span class="token comment">/// 判断数组中是否存在   </span>
    <span class="token comment">/// &lt;/summary&gt;   </span>
    <span class="token comment">/// &lt;param name="indexList"&gt;数组&lt;/param&gt;   </span>
    <span class="token comment">/// &lt;param name="index"&gt;索引&lt;/param&gt;   </span>
    <span class="token comment">/// &lt;returns&gt;&lt;/returns&gt;   </span>
    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">bool</span> <span class="token function">IsContain</span><span class="token punctuation">(</span><span class="token class-name">ArrayList</span> indexList<span class="token punctuation">,</span> <span class="token keyword">int</span> index<span class="token punctuation">)</span>
    <span class="token punctuation">{<!-- --></span>
        <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> indexList<span class="token punctuation">.</span>Count<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
        <span class="token punctuation">{<!-- --></span>
            <span class="token keyword">int</span> tempIndex <span class="token operator">=</span> Convert<span class="token punctuation">.</span><span class="token function">ToInt32</span><span class="token punctuation">(</span>indexList<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token keyword">if</span> <span class="token punctuation">(</span>tempIndex <span class="token operator">==</span> index<span class="token punctuation">)</span>
            <span class="token punctuation">{<!-- --></span>
                <span class="token keyword">return</span> <span class="token keyword">true</span><span class="token punctuation">;</span>
            <span class="token punctuation">}</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">return</span> <span class="token keyword">false</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token preprocessor property">#<span class="token directive keyword">endregion</span></span>
  • 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

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


注意:
比如:
DataTable dt=db.GetDataTable(“select * from 表名”); //获得datatable
DataView dv = new DataView(dt);//对dt这个表创建一个视图(注意:这里的DataView只能对一个datatable进行创建视图)
DataTable dt2 = dv.ToTable(true, “name“,”age“,”sex”);//true:true 去除重复,false 不去除; "name“,“age”,“sex”:表示需要显示的字段,特别注意:需要将每个栏位用双引号括起来,不然会报错:列“name,age,sex”不属于基础表
————————————————
原文链接:https://blog.csdn.net/qq_27929003/article/details/105675240

原文地址:https://www.cnblogs.com/sunny3158/p/14701544.html