如何在Datatable中检查重复值并删除构成重复的两行数据
实现方案
实现思路
- 首先定义重复行的判定规则(默认按整行所有列值匹配,可按需调整为仅对比指定列)
- 遍历DataTable统计每一行的出现频次,筛选出所有出现次数≥2的行的索引
- 倒序删除标记的行,避免正序删除时索引偏移导致删错行
C# 代码示例(.NET 生态 DataTable 通用)
小数据量场景直接用双层循环即可:
// 存储待删除的重复行索引,自动去重 HashSet<int> deleteIndexes = new HashSet<int>(); for (int i = 0; i < dataTable.Rows.Count; i++) { if (deleteIndexes.Contains(i)) continue; for (int j = i + 1; j < dataTable.Rows.Count; j++) { bool isDuplicate = true; // 逐列对比值,仅对比指定列可修改此处列范围 for (int col = 0; col < dataTable.Columns.Count; col++) { if (!dataTable.Rows[i][col].Equals(dataTable.Rows[j][col])) { isDuplicate = false; break; } } if (isDuplicate) { // 重复的两行全部标记为待删除 deleteIndexes.Add(i); deleteIndexes.Add(j); } } } // 倒序删除避免索引偏移 foreach (int idx in deleteIndexes.OrderByDescending(x => x)) { dataTable.Rows.RemoveAt(idx); }
大数据量优化方案
行数超过1000时用分组方式降低时间复杂度:
// 按行内容分组,可自定义拼接规则仅取指定列作为分组键 var duplicateGroups = dataTable.AsEnumerable() .GroupBy(row => string.Join("␞", row.ItemArray.Select(x => x?.ToString() ?? string.Empty))) .Where(g => g.Count() >= 2); // 收集所有重复组内的行 List<DataRow> rowsToDelete = duplicateGroups.SelectMany(g => g).ToList(); // 批量删除 foreach (DataRow row in rowsToDelete) { dataTable.Rows.Remove(row); }
注意:如果列值可能包含特殊分隔符
␞,可替换为其他不会出现在业务数据中的分隔符,或自定义类作为分组键避免字符串拼接问题。
内容的提问来源于stack exchange,提问作者KHV
相关产品推荐
相关产品推荐

