如何有效地比较C#中的两个数据表

时间:2014-06-04 00:29:50

标签: c# linq datatable

我正在研究一种方法,该方法接收两个数据表和一个主键列名列表并返回匹配项。我没有关于表格的任何其他信息。

我已经在网站上搜索了这个问题的解决方案并找到了一些答案,但没有一个能给我一个足够快的解决方案。

根据stackoverflow的结果,我现在有了这个:

var matches =
    (from rowA in tableA.AsEnumerable()
     from rowB in tableB.AsEnumerable()
     where primaryKeyColumnNames.All(column => rowA[column].ToString() == rowB[column].ToString())
     select new { rowA, rowB });

问题是这真的很慢。两个8000行的表需要4分钟。在我来到stackoverflow之前,我实际上正在遍历列和行需要2分钟。 (所以这实际上比我的速度慢)2-4分钟看起来不是很糟糕,直到我用350,000行击中桌子。这需要几天时间。我需要找到一个更好的解决方案。

有人能想到更快的方法吗?

编辑:根据tinstaafl的建议,现在是我的代码。

var matches = tableA.Rows.Cast<DataRow>().Select(rowA => new 
{
    rowA,
    rowB = tableB.Rows.Find(rowA.ItemArray.Where((x, y) => 
        primaryKeyColumnNames.Contains(tableA.Columns[y].ColumnName,
               StringComparer.InvariantCultureIgnoreCase)).ToArray())
})
.Where(x => x.rowB != null);    

1 个答案:

答案 0 :(得分:3)

使用PrimaryKey的{​​{1}}属性,它将接受一列列,应该会有所帮助。也许是这样的:

DataTable

在一个包含2个9900行的表并且常常返回9800的测试中,大约需要1/3秒。

相关问题