VB.NET:如何基于两个运行时DataTable生成合并列的新表(非Merge方式)
实现类似SQL Join的DataTable列合并(不使用Merge方法)
我懂你要的效果——就像SQL里基于Date列把两个表做连接,把Table2的所有非Date列都追加到Table1的结构里,同时对应填充数据,而且不能用Merge方法对吧?下面给你一个清晰的实现思路和代码示例:
核心步骤
- 第一步:复制Table1的结构和数据作为基础目标表
- 第二步:把Table2中除了
Date的列添加到目标表的结构中 - 第三步:遍历目标表的每一行,通过
Date字段匹配Table2中的对应行,填充新增列的数据
代码示例(C#)
// 假设你已经有了Table1和Table2两个DataTable DataTable targetTable = Table1.Copy(); // 复制Table1的结构和数据 // 添加Table2中除了Date的列到目标表 foreach (DataColumn col in Table2.Columns) { if (col.ColumnName != "Date") { targetTable.Columns.Add(new DataColumn(col.ColumnName, col.DataType)); } } // 遍历目标表的每一行,匹配Table2的数据填充 foreach (DataRow targetRow in targetTable.Rows) { string dateValue = targetRow["Date"].ToString(); // 在Table2中找到对应Date的行(这里用Select,也可以用Linq优化) DataRow[] matchingRows = Table2.Select($"Date = '{dateValue}'"); if (matchingRows.Length > 0) { DataRow sourceRow = matchingRows[0]; // 填充所有新增的列 foreach (DataColumn col in Table2.Columns) { if (col.ColumnName != "Date") { targetRow[col.ColumnName] = sourceRow[col.ColumnName]; } } } else { // 如果Table2中没有对应Date的行,可以设置默认值或者留空 foreach (DataColumn col in Table2.Columns) { if (col.ColumnName != "Date") { targetRow[col.ColumnName] = DBNull.Value; } } } } // 现在targetTable就是你要的结果表
补充说明
- 上面的代码默认是左连接逻辑(Table1的所有行都保留,Table2没有匹配的话填充空值),如果要做内连接,只需要在遍历前先过滤掉Table1中Table2没有对应Date的行即可
- 如果
Date是DateTime类型,注意Select语句的格式要调整,更推荐用Linq查询来匹配行,类型更安全:
// Linq方式匹配行 var matchingRow = Table2.AsEnumerable() .FirstOrDefault(row => row.Field<DateTime>("Date") == targetRow.Field<DateTime>("Date"));
内容的提问来源于stack exchange,提问作者Lubo拧 Krátký
相关产品推荐
相关产品推荐

