如何比较不同数据表中的2列

时间:2017-06-26 20:51:23

标签: c# datatable

table1

id  | fileName   |  fileDateTime
1   | somefile   |  somedatetime
2   | somefile2  |  somedatetime2

表2

id   |   fileName    |   fileDateTime
     |   somefile1   |   somedatetime1
     |   somefile2   |   somedatetime2

输出表3

id   |   fileName    |    fileDatetime
     |   somefile1   |    somedatetime1

我想比较两个表(仅限第2列和第3列),并且只有两个表中没有的表,第二个表中没有ID字段。然后我计划解析文件中的数据并将文件信息添加到数据库以记录文件已被解析。我在比较这两个领域时遇到了麻烦。这似乎不起作用。

for (int i = 0; i < finalTable.Rows.Count; i++)
{
    for (int r = 0; r < filesTable.Rows.Count; i++)
    {
        if (finalTable.Rows[i][2] == filesTable.Rows[r][2])
        {
            finalTable.Rows.Remove(finalTable.Rows[i]);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

假设该值是一个字符串,您可以执行

for (int i = 0; i < finalTable.Rows.Count; i++)
{
    for (int r = 0; r < filesTable.Rows.Count; i++)
    {
        if (finalTable.Rows[r].Field<string>(2) == filesTable.Rows[r].Field<string>(2))
        {
            finalTable.Rows.Remove(finalTable.Rows[i]);
        }
    }
}

如果是另一种类型,只需更改真实类型的<string>即可!

答案 1 :(得分:0)

您可以使用Linq实现它,如下所示。

假设您的字段是字符串。对于其他数据类型,您可以相应地转换它们:

using System.Data.Linq;
......
......
// Merge both tables data and group them by comparing columns values
dt1.Merge(dt2); 
var g = dt1.AsEnumerable()
        .GroupBy(x => x[0]?.ToString() + x[1]?.ToString()) // You can build Unique key here, I used string concatination
        .ToDictionary(x => x.Key, y => y.ToList());

var unique = dt1.Clone();

foreach (var e in g)
{
    if (e.Value.Count() == 1) // In either table - Intersaction 
    {
        e.Value.CopyToDataTable(unique, LoadOption.OverwriteChanges);
    }

    if (e.Value.Count() == 2) 
    {
        // In both tables -Union
    }
}