3 回答
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)算法,我认为它会变得更好。
- 3 回答
- 0 关注
- 454 浏览
添加回答
举报