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

C#通用实现:匹配DataTable列名并填充对应数据

通用DataTable数据填充方案

针对你需要的通用场景,核心思路是提取Table1列名的最后字段部分,和Table2的纯字段名匹配,然后批量填充数据,完全不需要硬编码列名。下面是可直接复用的实现代码和关键说明:

实现步骤与代码

1. 核心工具方法:提取列名的最后字段

先写一个小方法,用来从带前缀的列名里取出最后一部分:

private string GetLastFieldName(string fullColumnName)
{
    // 按点分割列名,取最后一段
    if (string.IsNullOrEmpty(fullColumnName))
        return string.Empty;
    
    string[] parts = fullColumnName.Split('.');
    return parts[^1]; // C# 8.0及以上可用,等价于 parts[parts.Length - 1]
}

2. 通用填充方法

这个方法可以处理任意符合格式的Table1和Table2:

public void FillTable2FromTable1(DataTable table1, DataTable table2)
{
    // 先建立Table1列名到Table2列名的映射
    Dictionary<string, string> columnMap = new Dictionary<string, string>();
    
    foreach (DataColumn col in table1.Columns)
    {
        string targetField = GetLastFieldName(col.ColumnName);
        // 检查Table2是否存在该字段,存在才加入映射
        if (table2.Columns.Contains(targetField))
        {
            columnMap.Add(col.ColumnName, targetField);
        }
    }

    // 遍历Table1的每一行,填充到Table2
    foreach (DataRow row1 in table1.Rows)
    {
        DataRow row2 = table2.NewRow();
        
        foreach (var kvp in columnMap)
        {
            string sourceCol = kvp.Key;
            string targetCol = kvp.Value;
            
            // 直接赋值,注意确保数据类型兼容,如果有类型差异可以加转换逻辑
            row2[targetCol] = row1[sourceCol] == DBNull.Value ? DBNull.Value : row1[sourceCol];
        }
        
        table2.Rows.Add(row2);
    }
}

关键说明

  • 无硬编码:整个逻辑完全依赖列名的格式自动匹配,不管Table1和Table2有多少列,只要最后字段名对应就会自动处理
  • 容错处理:如果Table1提取后的字段在Table2里不存在,会自动跳过该列,避免抛出异常
  • 空值处理:保留原始数据的DBNull值,避免赋值时出现空引用问题
  • 类型兼容:确保Table1和Table2对应列的数据类型一致,如果有需要,可以在赋值时添加类型转换(比如Convert.ToString()、Convert.ToInt32()等)

使用示例

比如你的场景里,直接调用即可:

// 假设你已经有了初始化好的table1和table2
FillTable2FromTable1(table1, table2);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:52:12