C# 合并 DataTable 与计数器

C# Merge DataTable with counter

在我的程序中,我将结果保存和加载为 xml 文件。 我加载旧结果并想将它们与新结果进行比较,除了级别。 应仅保存新结果中的元素。 如果一个元素同时出现在旧结果和新结果中,则级别应该提高。

结果的结构有所不同,但基本上如下所示:

 --------------------------------------
| ID(int)  | ... | Level(int) |
 --------------------------------------

ID    = Unique identifier, always first; 
...   = Some other stuff depending on the sql query;
Level = Counter, incraeses each time the element appears in results, always last

示例:

旧结果:

1 ; Item1 ; 1
2 ; Item2 ; 2
4 ; Item4 ; 1

新结果:

1 ; Item1 ; 1
2 ; Item2 ; 2
7 ; Item7 ; 1

最后的 table 应该是这样的。

1 ; Item1 ; 2
2 ; Item2 ; 3
7 ; Item7 ; 1

到目前为止我做了什么

    // Returns the final DataTable 
    private static DataTable UpdateResults(DataTable oldResults,DataTable newResults) {
        // This is where I want to compare the DataTables          
    }

问题

如何获取两个table的交集(没有级别列)作为一个新的DataTable并增加级别?

所以你有两个 DataTables 并且你想通过增加 counter/level 列将旧的合并到新的?这种使用 LINQ 的 ToLookup 的方法应该有效:

var oldIdLookup = oldResults.AsEnumerable().ToLookup(r => r.Field<int>("ID"));
DataTable final = newResults.Clone();
foreach (DataRow row in newResults.Rows)
{
    int id = row.Field<int>("ID");
    int level = row.Field<int>("Level");
    int count = oldIdLookup[id].Count(); // change logic if desired
    int newLevel = level + count;        // change logic if desired
    final.Rows.Add(id, row.Field<string>("Name"), newLevel);
}