C# 合并两个具有相同列数但名称不同的数据表

问题描述 投票:0回答:1

我有这个 C# 脚本,正在 Power Automate Desktop (PAD) 的“运行 .NET 脚本”操作中使用

DT1.Merge(DT2);
FinalTable = DT1.DefaultView.ToTable();

这些是脚本参数:

.NET参数名称 类型 方向 输入值 输出变量
DT1 数据表 %数据表%
DT2 数据表 %数据表2%
决赛桌 数据表 %时态表%

但是,我有一个问题。两个表的列数相同,但列名不同。所以,表格看起来像这样:

DT1:

第1栏 第2栏
214 324233
233 33
3 3

DT2:

第3栏 第4栏
3423 32454
55 5334

我明白了:

第1栏 第2栏 第3栏 第4栏
214 32433
233 33
3 3
3423 32454
55 5334

但是,我想要的结果是这样的:

第1栏 第2栏
214 32433
233 33
3 3
3423 32454
55 5334

如果我将脚本更改为:

DT1.Merge(DT2, false, MissingSchemaAction.Ignore);
FinalTable = DT1.DefaultView.ToTable();

这就是我得到的:

第1栏 第2栏
214 32433
233 33
3 3

所以我没有从 DT2 获取值。

我想这样做并避免使用 for every 循环。

那么,可以吗?

提前致谢!

c# .net power-automate rpa power-automate-desktop
1个回答
0
投票

但我很好奇是否有办法实现这一点

如果您查看 .NET 源代码中 RecordManager 的第 203 行,您会发现将列命名为相同(根据注释)(如果您希望使用Merge 方法,调用 RecordManager 来复制数据:

200    int count = table.Columns.Count;
201    for (int i = 0; i < count; ++i) {
202      DataColumn dstColumn = table.Columns[i];
203      DataColumn srcColumn = src.Columns[dstColumn.ColumnName];
204      if (null != srcColumn) {
205        object value = srcColumn[record];
206        ICloneable cloneableObject = value as ICloneable;

如果您寻求不使用 Merge() 的替代方案,则需要推出自己的实现

  • 将其中一张表设置为具有主键列,我们将其称为 A
  • 循环另一个表(我们称之为 B)的行,使用
    A.Rows.Find
  • 查找其主键值
  • 如果没有找到一行,请创建一个新行
  • 运行 for 循环,将数据按位置复制到找到的行/新行

本质上,这将是对 Merge 已经存在的轮子的重新发明;合并是一个非常复杂且经过深思熟虑的代码块,它复制新旧的所有内容(数据行跟踪每列的原始值和修改值、状态和错误)

总而言之,我想说执行位置复制的最佳方法是仅使用 for 循环来使列名相等,以便 RecordManager 最终执行位置复制

© www.soinside.com 2019 - 2024. All rights reserved.