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);
}
在我的程序中,我将结果保存和加载为 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);
}