如何删除DataTable中存在任意列值重复的行?
删除DataTable中任意列含重复值的所有行
要实现删除所有存在任意列值重复的行(即只要某列出现重复值,所有包含该值的行都移除),可以按以下思路实现:
核心逻辑
- 先定位每一列中出现次数≥2的重复值集合
- 遍历DataTable所有行,只要该行任意一列的值属于对应列的重复值集合,就标记为待删除
- 统一删除标记行(避免遍历中修改表结构导致的索引异常)
具体代码实现
using System.Data; using System.Linq; using System.Collections.Generic; public static void RemoveRowsWithAnyDuplicates(DataTable targetTable) { // 1. 收集每一列的重复值集合 var columnDuplicateValues = new Dictionary<string, HashSet<object>>(); foreach (DataColumn column in targetTable.Columns) { // 统计当前列各值出现次数,筛选出重复值 var duplicateValues = targetTable.AsEnumerable() .GroupBy(row => row[column]) .Where(group => group.Count() > 1) .Select(group => group.Key); columnDuplicateValues[column.ColumnName] = new HashSet<object>(duplicateValues); } // 2. 筛选出所有需要删除的行 var rowsToDelete = targetTable.AsEnumerable() .Where(row => targetTable.Columns.Cast<DataColumn>() .Any(col => columnDuplicateValues[col.ColumnName].Contains(row[col])) ) .ToList(); // 3. 执行删除操作 foreach (var row in rowsToDelete) { row.Delete(); } // 提交表修改 targetTable.AcceptChanges(); }
补充优化
如果需要同时移除空值或DBNull的行,可以在筛选待删除行时追加判断条件:
.Where(row => targetTable.Columns.Cast<DataColumn>().Any(col => columnDuplicateValues[col.ColumnName].Contains(row[col])) || targetTable.Columns.Cast<DataColumn>().Any(col => row.IsNull(col) || string.IsNullOrEmpty(row[col]?.ToString().Trim())) )
调用方式:直接传入你的DataTable对象即可
RemoveRowsWithAnyDuplicates(tblcsv);
内容的提问来源于stack exchange,提问作者Valeso
相关产品推荐
相关产品推荐

