C# – 从DataTable中删除具有相同列值的行

我有一个DataTable ,如下所示:

  ID Name DateBirth ....................... 1 aa 1.1.11 2 bb 2.3.11 2 cc 1.2.12 3 cd 2.3.12 

哪个是删除具有相同ID的行的最快方法,以获得类似的内容(保留第一个出现,删除下一​​个):

  ID Name DateBirth ....................... 1 aa 1.1.11 2 bb 2.3.11 3 cd 2.3.12 

我不想双重传递表行,因为行号很大。 我想尽可能使用一些LinQ,但我想这将是一个大问题,我必须使用比较器。

您可以使用LINQ to DataTable,根据列ID ,您可以在此列上进行分组 ,然后先选择

  var result = dt.AsEnumerable() .GroupBy(r => r.Field("ID")) .Select(g => g.First()) .CopyToDataTable(); 

我正在解决同样的情况,发现它非常有趣,并希望分享我的发现。

  1. 如果要根据ALL COLUMNS区分行
 DataTable newDatatable = dt.DefaultView.ToTable(true, "ID", "Name", "DateBirth"); 

你在这里提到的列,只有那些将在newDatatable返回。

  1. 如果基于一列和列类型的不同是int,那么我更喜欢LINQ查询。
  DataTable newDatatable = dt.AsEnumerable() .GroupBy(dr => dr.Field("ID")) .Select(dg => dg).Take(1) .CopyToDataTable(); 
  1. 如果基于一列和列类型的字符串字符串,那么我更喜欢循环。
 List toExclude = new List(); for (int i = 0; i < dt.Rows.Count; i++) { var idValue = (string)dt.Rows[i]["ID"]; if (toExclude.Contains(idValue)) { dt.Rows.Remove(dt.Rows[i]); i--; } toExclude.Add(glAccount); } 

第三是我的最爱。

我可能已经回答了一些问题没有提到的问题。 这是出于良好的意图,也没有兴奋。

希望能帮助到你。

不一定是最有效的方法,但可能是最可读的:

 table = table.AsEnumerable() .GroupBy(row => row.Field("ID")) .Select(rowGroup => rowGroup.First()) .CopyToDataTable(); 

Linq也更强大。 例如,如果要更改逻辑而不是根据DateBirth选择每个id组的第一个(任意)行,而选择最后一个:

 table = table.AsEnumerable() .GroupBy(row => row.Field("ID")) .Select(rowGroup => rowGroup .OrderByDescending(r => r.Field("DateBirth")) .First()) .CopyToDataTable(); 
  1. 获取每个ID的记录计数
 var rowsToDelete = (from row in dataTable.AsEnumerable() group row by row.ID into g where g.Count() > 1 
  1. 确定要保留哪条记录(不知道您的标准;我将按DoB排序然后Name并保留第一条记录)并选择其余记录
 select g.OrderBy( dr => dr.Field( "DateBirth" ) ).ThenBy( dr => dr.Field( "Name" ) ).Skip(1)) 
  1. 弄平
 .SelectMany( g => g ); 
  1. 删除行
 rowsToDelete.ForEach( dr => dr.Delete() ); 
  1. 接受更改
 dataTable.AcceptChanges(); 

你可以试试这个

 DataTable uniqueCols = dt.DefaultView.ToTable(true, "ID"); 

这是一种实现这一目标的方法,所有你需要使用moreLinq库使用它的functionDistinctBy

码:

 protected void Page_Load(object sender, EventArgs e) { var DistinctByIdColumn = getDT2().AsEnumerable() .DistinctBy( row => new { Id = row["Id"] }); DataTable dtDistinctByIdColumn = DistinctByIdColumn.CopyToDataTable(); } public DataTable getDT2() { DataTable dt = new DataTable(); dt.Columns.Add("Id", typeof(string)); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Dob", typeof(string)); dt.Rows.Add("1", "aa","1.1.11"); dt.Rows.Add("2", "bb","2.3.11"); dt.Rows.Add("2", "cc","1.2.12"); dt.Rows.Add("3", "cd","2.3.12"); return dt; } 

OutPut:正如您所期望的那样

在此处输入图像描述

有关更多林克示例代码,请查看我的博客