LINQ根据特定行的值从数据表中删除重复行

时间:2014-12-22 08:45:32

标签: c# linq datatable duplicates

我已经看到以下解决方案用于使用DataTable删除LINQ中的重复行:

如果我们的DataTable有一个名为dt的重复行,那么以下状态显然可以完成这项工作:

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

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

E.g。如果我们有一个名为&#34;电子邮件&#34;的行的数据表,我们如何删除所有具有相同电子邮件值的行?

1 个答案:

答案 0 :(得分:8)

简单方法:使用GroupBy

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

您也可以尝试使用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();

自定义行比较器:

 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