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
相关产品推荐
相关产品推荐

