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

