为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
暮色呼如 2019-12-03 16:34:17
我有两个由CSV文件生成的DataTable A和B。我需要能够检查中B不存在的行A。有没有一种方法可以执行某种查询以显示不同的行,或者我必须遍历每个DataTable的每一行以检查它们是否相同?如果表变大,后一种选择似乎非常密集。
查看完整描述

3 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

到目前为止的答案都假定您只是在寻找重复的主键。这是一个非常简单的问题-例如,您可以使用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)算法,我认为它会变得更好。


查看完整回答
反对 回复 2019-12-03
  • 3 回答
  • 0 关注
  • 429 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信