比较两个数据表以确定其中一个而不是另一个的行

我有两个由CSV文件生成的DataTable AB。我需要能够检查中B不存在的行A

有没有一种方法可以执行某种查询以显示不同的行,或者我必须遍历每个DataTable的每一行以检查它们是否相同?如果表变大,后一种选择似乎非常密集。


暮色呼如
浏览 428回答 3
3回答

SMILET

到目前为止的答案都假定您只是在寻找重复的主键。这是一个非常简单的问题-例如,您可以使用Merge()方法。但我理解您的问题意味着您正在寻找重复的DataRows。(从问题描述出发,两个表都是从CSV文件导入的,我什至假设原始行没有主键值,并且在导入期间通过AutoNumber分配了任何主键。)天真的实现(对于A中的每一行,将其ItemArray与B中的每一行进行比较)确实会在计算上变得昂贵。一种更便宜的方法是使用哈希算法。对于每个DataRow,将其列的字符串值连接为单个字符串,然后对该字符串调用GetHashCode()以获取一个int值。Dictionary<int, DataRow>为DataTable B中的每个DataRow 创建一个包含项,该项键入哈希码。然后,对于DataTable A中的每个DataRow,计算哈希码,并查看其是否包含在字典中。如果不是这样,您就会知道DataRow在DataTable B中不存在。这种方法有两个缺点,这两个缺点都是因为两个字符串可能不相等,但是产生相同的哈希码。如果您在A中找到一行,其哈希值在字典中,则需要检查字典中的DataRow以验证两行是否真正相等。第二个缺点更加严重:B中的两个不同的DataRows不可能(但有可能)散列为相同的键值。因此,字典实际上应该是Dictionary<int, List<DataRow>>,并且您应该对列表中的每个DataRow执行上一段中所述的检查。要使此功能正常运行,需要花费大量的工作,但这是一种O(m + n)算法,我认为它会变得更好。
打开App,查看更多内容
随时随地看视频慕课网APP