You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:36:03