我有这个 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 循环。
那么,可以吗?
提前致谢!
但我很好奇是否有办法实现这一点
如果您查看 .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.Rows.Find
本质上,这将是对 Merge 已经存在的轮子的重新发明;合并是一个非常复杂且经过深思熟虑的代码块,它复制新旧的所有内容(数据行跟踪每列的原始值和修改值、状态和错误)
总而言之,我想说执行位置复制的最佳方法是仅使用 for 循环来使列名相等,以便 RecordManager 最终执行位置复制