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();
我正在解决同样的情况,发现它非常有趣,并希望分享我的发现。
- 如果要根据ALL COLUMNS区分行 。
DataTable newDatatable = dt.DefaultView.ToTable(true, "ID", "Name", "DateBirth");
你在这里提到的列,只有那些将在newDatatable
返回。
- 如果基于一列和列类型的不同是int,那么我更喜欢
LINQ
查询。
DataTable newDatatable = dt.AsEnumerable() .GroupBy(dr => dr.Field("ID")) .Select(dg => dg).Take(1) .CopyToDataTable();
- 如果基于一列和列类型的字符串是字符串,那么我更喜欢循环。
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();
- 获取每个
ID
的记录计数
var rowsToDelete = (from row in dataTable.AsEnumerable() group row by row.ID into g where g.Count() > 1
- 确定要保留哪条记录(不知道您的标准;我将按DoB排序然后
Name
并保留第一条记录)并选择其余记录
select g.OrderBy( dr => dr.Field( "DateBirth" ) ).ThenBy( dr => dr.Field( "Name" ) ).Skip(1))
- 弄平
.SelectMany( g => g );
- 删除行
rowsToDelete.ForEach( dr => dr.Delete() );
- 接受更改
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:正如您所期望的那样
有关更多林克示例代码,请查看我的博客