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

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ý

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:47:41