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

如何在C#中合并两个DataTable实现笛卡尔积?能否用Merge方法?

实现两个DataTable的笛卡尔积合并

嘿,我来帮你搞定这个需求!首先直接给结论:不能用DataTable.Merge()方法完成你要的合并。因为Merge()的设计初衷是合并结构相似的表(比如把同结构的表行合并,或者根据主键匹配更新数据),而你需要的是两个表的笛卡尔积——也就是每个set_id和所有segment记录一一配对生成新行。

下面给你两种实用的实现方式:

方法一:用LINQ快速实现

这是最简洁的写法,利用LINQ的笛卡尔积查询来生成结果表:

// 先创建结果表的结构,包含需要的三个列
DataTable resultDt = new DataTable();
resultDt.Columns.Add("set_id", typeof(int));
resultDt.Columns.Add("segment_id", typeof(int));
resultDt.Columns.Add("seg_description", typeof(string));

// 通过LINQ遍历两个表的所有行组合,生成数据
var cartesianQuery = from setRow in dtTemp2.AsEnumerable()
                     from segRow in dtTemp.AsEnumerable()
                     select new 
                     {
                         SetId = setRow.Field<int>("set_id"),
                         SegmentId = segRow.Field<int>("segment_id"),
                         SegDescription = segRow.Field<string>("seg_description")
                     };

// 将查询结果填充到结果表中
foreach (var item in cartesianQuery)
{
    resultDt.Rows.Add(item.SetId, item.SegmentId, item.SegDescription);
}

方法二:传统嵌套循环实现

如果更习惯用传统的循环写法,也可以这样做:

// 创建结果表结构
DataTable resultDt = new DataTable();
resultDt.Columns.Add("set_id", typeof(int));
resultDt.Columns.Add("segment_id", typeof(int));
resultDt.Columns.Add("seg_description", typeof(string));

// 遍历第二个表的每一个set_id
foreach (DataRow setRow in dtTemp2.Rows)
{
    int currentSetId = (int)setRow["set_id"];
    // 遍历第一个表的每一条segment记录,和当前set_id配对添加
    foreach (DataRow segRow in dtTemp.Rows)
    {
        int segId = (int)segRow["segment_id"];
        string segDesc = segRow["seg_description"].ToString();
        resultDt.Rows.Add(currentSetId, segId, segDesc);
    }
}

为什么Merge()不适用?

再补充解释下Merge()的逻辑:它需要两个表有匹配的主键或者相同的结构。比如你尝试用dtTemp2.Merge(dtTemp),结果只会是把dtTemp的列添加到dtTemp2中,但行还是只有2行,segment相关的列会是空值——完全不是你要的所有组合效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:31:07