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

C# DataTable去重:将空单元格视为任意值保留唯一组合

解决C#动态列DataTable中移除被包含行的问题

核心逻辑是将空单元格视为通配符,判断某行是否被其他行"包含"(即被包含行的非空列值,在包含行的对应列中完全匹配),若存在这样的包含行则移除被包含行。DataTable.DefaultView.ToTable(true)只能做严格的列值匹配去重,无法满足通配符式的包含判断,因此需要自定义逻辑处理。

实现思路

  1. 定义判断方法:检查一行是否被另一行包含,遍历所有动态列,统一处理空值判断;
  2. 遍历原表所有行,筛选出不被任何其他行包含的行,组成新的结果表。

核心代码

1. 判断行包含关系的方法

private static bool IsRowIncluded(DataRow rowToCheck, DataRow potentialIncludingRow)
{
    foreach (DataColumn col in rowToCheck.Table.Columns)
    {
        object checkValue = rowToCheck[col];
        object includeValue = potentialIncludingRow[col];
        
        // 统一处理空字符串和DBNull,视为通配符
        if (checkValue is string strCheck && string.IsNullOrEmpty(strCheck))
            checkValue = DBNull.Value;
        if (includeValue is string strInclude && string.IsNullOrEmpty(strInclude))
            includeValue = DBNull.Value;
        
        // 被检查行的当前列非空,且与包含行的列值不相等 → 不满足包含条件
        if (checkValue != DBNull.Value && !checkValue.Equals(includeValue))
        {
            return false;
        }
    }
    // 所有列都满足包含条件
    return true;
}

2. 处理DataTable的主方法

private static DataTable RemoveIncludedRows(DataTable originalTable)
{
    // 克隆原表结构,创建结果表
    DataTable resultTable = originalTable.Clone();
    
    foreach (DataRow currentRow in originalTable.Rows)
    {
        bool isCurrentRowIncluded = false;
        
        foreach (DataRow otherRow in originalTable.Rows)
        {
            // 跳过自身和完全相同的行
            if (currentRow == otherRow || currentRow.ItemArray.SequenceEqual(otherRow.ItemArray))
                continue;
            
            // 检查当前行是否被其他行包含
            if (IsRowIncluded(currentRow, otherRow))
            {
                isCurrentRowIncluded = true;
                break;
            }
        }
        
        // 仅保留未被任何行包含的行
        if (!isCurrentRowIncluded)
        {
            resultTable.ImportRow(currentRow);
        }
    }
    
    return resultTable;
}

代码说明

  • 空值处理:统一将空字符串转换为DBNull.Value,确保空单元格的通配符逻辑一致;
  • 包含判断:只有当被检查行的所有非空列都与另一行的对应列值完全匹配时,才认为被包含;
  • 动态列支持:通过遍历DataTable.Columns集合处理任意数量的列,无需硬编码列名;
  • 结果生成:通过克隆原表结构,导入符合条件的行,避免修改原表数据。

使用示例

// 假设originalTable是你的源DataTable
DataTable cleanedTable = RemoveIncludedRows(originalTable);

内容的提问来源于stack exchange,提问作者gamer42069

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:20:29