LINQ从一个DataTable基于特定行的值删除重复的行 [英] LINQ to remove duplicate rows from a datatable based on the value of a specific row

查看:695
本文介绍了LINQ从一个DataTable基于特定行的值删除重复的行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经看到了用于去除重复行以下解决方案数据表使用 LINQ



说,如果我们有一个数据表与所谓的重复的行 DT ,然后以下statemend显然做这项工作:

 的IEnumerable<&的DataRow GT; uniqueContacts = dt.AsEnumerable()是不同的(DataRowComparer.Default)。 



但这只是去除相同重复的行。我想要做的是消除所有具有特定行的重复值的行。



例如。如果我们有一个名为电子邮件行,我们怎么可以删除所有具有相同的电子邮件值?


解决方案
<行的DataTable p>简单的方法:用 GROUPBY

  VAR uniqueContacts = DT。 AsEnumerable()
.GroupBy(X => x.Field<串GT;(电子邮件))
。选择(G => g.First());

您也可以尝试使用鲜明

  DataTable的DT =新的DataTable(); 
dt.Columns.Add(ID);
dt.Columns.Add(名字);
dt.Columns.Add(电子邮件);
dt.Rows.Add(1,添,tim@mail.com);
dt.Rows.Add(2,TIM1,tim@mail.com);
dt.Rows.Add(3,TIM2,tim2@mail.com);
dt.Rows.Add(4TIM3,tim3@mail.com);

dt.AsEnumerable()是不同的(新DataRowComparer())转储()。



自定义行比较器:

 公共类DataRowComparer:&的IEqualityComparer LT; DataRow的> 
{
公共布尔等于(DataRow的T1,DataRow的T2)
{
回报率(t1.Field<串>(电子邮件)== t2.Field<串>( 电子邮件));
}
公众诠释的GetHashCode(DataRow的T)
{
返回t.ToString()GetHashCode()方法。
}
}

http://msdn.microsoft.com/en-us/library/bb338049.aspx


I have seen the following solution used for removing duplicate rows in a DataTable using LINQ:

Say if we have a DataTable with duplicate rows called dt, then the following statemend apparently does the job:

IEnumerable<DataRow> uniqueContacts = dt.AsEnumerable().Distinct(DataRowComparer.Default);

But this is only removing duplicate rows that are identical. What I want to do is to remove all the rows that have duplicate values of a specific row.

E.g. If we have a datatable with a row called "Email", how can we remove all the rows that have the same email value?

解决方案

simple way: use GroupBy:

var uniqueContacts = dt.AsEnumerable()
                       .GroupBy(x=>x.Field<string>("Email"))
                       .Select(g=>g.First());

you can also try use Distinct:

    DataTable dt = new DataTable();  
    dt.Columns.Add("ID");  
    dt.Columns.Add("FirstName");  
    dt.Columns.Add("Email");  
    dt.Rows.Add(1,"Tim","tim@mail.com");
    dt.Rows.Add(2,"Tim1","tim@mail.com");
    dt.Rows.Add(3,"Tim2","tim2@mail.com");
    dt.Rows.Add(4,"Tim3","tim3@mail.com");

    dt.AsEnumerable().Distinct(new DataRowComparer()).Dump();

Custom row comparer:

 public class DataRowComparer : IEqualityComparer<DataRow>  
    {  
        public bool Equals(DataRow t1, DataRow t2)  
        {  
            return (t1.Field<string>("Email")==t2.Field<string>("Email"));  
        }  
        public int GetHashCode(DataRow t)  
        {  
            return t.ToString().GetHashCode();  
        }  
    }  

http://msdn.microsoft.com/en-us/library/bb338049.aspx

这篇关于LINQ从一个DataTable基于特定行的值删除重复的行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆