Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#将数据表与计数器合并_C#_Database_Datatable_Compare_Intersection - Fatal编程技术网

C#将数据表与计数器合并

C#将数据表与计数器合并,c#,database,datatable,compare,intersection,C#,Database,Datatable,Compare,Intersection,在我的程序中,我将结果保存并加载为xml文件。 我加载旧结果,并希望将它们与新结果进行比较,但级别除外。 应仅保存新结果中的元素。 如果一个元素同时出现在旧结果和新结果中,则级别应增加 结果的结构有所不同,但基本上如下所示: -------------------------------------- | ID(int) | ... | Level(int) | -------------------------------------- ID = Unique identifie

在我的程序中,我将结果保存并加载为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
最后一张表应该是这样的

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);
}