C#将数据表与计数器合并
在我的程序中,我将结果保存并加载为xml文件。 我加载旧结果,并希望将它们与新结果进行比较,但级别除外。 应仅保存新结果中的元素。 如果一个元素同时出现在旧结果和新结果中,则级别应增加 结果的结构有所不同,但基本上如下所示:C#将数据表与计数器合并,c#,database,datatable,compare,intersection,C#,Database,Datatable,Compare,Intersection,在我的程序中,我将结果保存并加载为xml文件。 我加载旧结果,并希望将它们与新结果进行比较,但级别除外。 应仅保存新结果中的元素。 如果一个元素同时出现在旧结果和新结果中,则级别应增加 结果的结构有所不同,但基本上如下所示: -------------------------------------- | ID(int) | ... | Level(int) | -------------------------------------- ID = Unique identifie
--------------------------------------
| 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
最后一张表应该是这样的
1 ; Item1 ; 2
2 ; Item2 ; 3
7 ; Item7 ; 1
到目前为止我做了什么
问题:
如何将两个表(没有级别列)的交集作为新的数据表并增加级别?因此您有两个
数据表
,并且希望通过增加计数器/级别列将旧数据表合并到新数据表中?使用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);
}
var oldilookup=oldResults.AsEnumerable().ToLookup(r=>r.Field(“ID”);
DataTable final=newResults.Clone();
foreach(newResults.Rows中的数据行)
{
int id=行字段(“id”);
int level=行字段(“级别”);
int count=oldilookup[id].count();//如果需要,请更改逻辑
int newLevel=level+count;//如果需要,请更改逻辑
final.Rows.Add(id,row.Field(“名称”),newLevel);
}
您能告诉我们到目前为止您做了什么吗?我原以为级别应该提高,但Item2
的最终表格级别与old@TimSchmelter是的,我改正了,对不起!几乎正确,我有两个数据表,只想保留新数据表中的数据,但如果数据也存在于旧数据表中,则提高级别。@er4zox:但这就是我在这里要做的。这只循环新的dataTable,因此您可以得到所有新行。旧的行仅用于查找id和获取新级别。
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);
}