我有两个DataTable,A
并且B
是从CSV文件生成的.我需要能够检查哪些行B
不存在A
.
有没有办法进行某种查询来显示不同的行,还是我必须遍历每个DataTable上的每一行来检查它们是否相同?如果表格变大,后一种选择似乎非常密集.
假设你有一个适当类型的ID列(即给出一个哈希码并实现相等) - 在这个例子中的字符串,这是一个伪代码,因为我不熟悉DataTables并且没有时间查看所有内容刚才:)
IEnumerableidsInA = tableA.AsEnumerable().Select(row => (string)row["ID"]); IEnumerable idsInB = tableB.AsEnumerable().Select(row => (string)row["ID"]); IEnumerable bNotA = idsInB.Except(idsInA);
我是否必须遍历每个DataTable上的每一行以检查它们是否相同.
看到你已经从CSV文件加载了数据,你就不会有任何索引或任何东西,所以在某些时候,某些事情必须遍历每一行,无论是代码还是库, 管他呢.
无论如何,这是一个算法问题,这不是我的专长,但我天真的方法如下:
1:您可以利用数据的任何属性吗?每个表中的所有行都是唯一的,您可以按相同的标准对它们进行排序吗?如果是这样,你可以这样做:
按照ID对两个表进行排序(使用一些有用的东西,比如quicksort).如果他们已经排序,那么你就赢了.
一次跳过两个表,跳过任一表中ID的任何间隙.匹配ID的平均重复记录.
这允许你在(排序时间*2)+一次通过中进行,所以如果我的big-O-notation是正确的,那就是(无论什么时候排序)+ O(m + n)这是非常好的.
(修订版:这是ΤΖΩΤΖΙΟΥ描述的方法)
2:另一种方法,根据数据的大小,效率可能更高或更低:
运行表1,对于每一行,将它的ID(或计算的哈希码,或该行的一些其他唯一ID)粘贴到字典中(如果您更喜欢将其称为哈希表).
运行表2,对于每一行,查看字典中是否存在ID(或哈希码等).你正在利用字典真的很快的事实 - 我认为O(1)?抬头.这一步将非常快,但您已经付出了所有这些字典插入的价格.
我真的很想知道那些比我更熟悉算法知识的人为这一个提出了什么:-)
您可以在DataTable上使用Merge和GetChanges方法来执行此操作:
A.Merge(B); // this will add to A any records that are in B but not A return A.GetChanges(); // returns records originally only in B