在 C# 中从上到下连接两个数据表

Posted

技术标签:

【中文标题】在 C# 中从上到下连接两个数据表【英文标题】:Joining two DataTables top to bottom in C# 【发布时间】:2014-01-01 07:54:15 【问题描述】:

我有两个数据表

Dt1-
a b c d
e f g h
Dt2
a1 b1 c1 d1
e1 f1 g1 h1

我正在尝试将这两者连接起来创建另一个数据表作为-

Dt1    
    a b c d
    e f g h
    a1 b1 c1 d1
    e1 f1 g1 h1

我正在做 dt1.merge(dt2)。它正在覆盖 d1 并仅将输出作为 dt2 的值。 有没有这样的方法,或者我必须像下面的方法一样将 dt2 逐行添加到 dt1?

foreach (DataRow dr in dt2.Rows) 
dt.Rows.Add(dr.ItemArray);

【问题讨论】:

架构一样吗? 是的,架构完全相同。 Datatabe.merge 正在覆盖我以前的数据。我不确定为什么会这样。 是否定义了主键?在这种情况下,每个DataRowRowState 用于确定将使用的行。您应该在将其状态设置为Unchanged 之前显式调用DataTable.AcceptChanges。除此之外,如果循环有效,请使用它。请注意,您也可以使用DataTable.ImportRow 代替ItemArray-方法。 @TimSchmelter 我已将主键定义为每个数据表的第一列。你是不是建议我在创建主键时所做的更改没有保存,我必须调用acceptchanges? 那么两个表中的 PK 相同吗?如果是这样,您想对这些重复项做什么? 【参考方案1】:

使用 union 来合并行集 (http://msdn.microsoft.com/en-us/library/bb358407(v=vs.110).aspx) 然后你可以去以下

var rows = dt1.Rows.Union(dt2.Rows).ToArray();
var res = new DataTable();

Array.ForEach(res, (r) => res.Rows.Add(r) );

【讨论】:

这将起作用,它需要逐行添加到 dt1。但是我的表有几百万行并且没有像合并这样的函数将表添加到表的底部。 您能告诉我您打算如何处理结果表吗? 我将其打印到制表符分隔的文件中。 以便 DataTable 对象不是“必须”。 IEnumerable 而不是 DataTable 呢?如果它适合你,那么答案将是我答案的第一行。甚至 var rows = dt1.Rows.Union(dt2.Rows) 就足够了。 没有像合并这样的方法将一个表添加到另一个具有相同架构的表的底部。

以上是关于在 C# 中从上到下连接两个数据表的主要内容,如果未能解决你的问题,请参考以下文章

C#刷剑指Offer | 从上到下打印二叉树

$.getJSON:javascript 不从上到下运行 [重复]

数据仓库分层(五层,从上到下数据量依次越来越少)

数据仓库分层(五层,从上到下数据量依次越来越少)

Flutter 按需rebuild-ValueListenableBuilder

Flutter功能型组件之数据共享