我有两个DataTable,A并且B是从CSV文件生成的.我需要能够检查哪些行B不存在A.
有没有办法进行某种查询来显示不同的行,还是我必须遍历每个DataTable上的每一行来检查它们是否相同?如果表格变大,后一种选择似乎非常密集.
Jon*_*eet 20
假设你有一个适当类型的ID列(即给出一个哈希码并实现相等) - 在这个例子中的字符串,这是一个伪代码,因为我不熟悉DataTables并且没有时间查看所有内容刚才:)
IEnumerable<string> idsInA = tableA.AsEnumerable().Select(row => (string)row["ID"]);
IEnumerable<string> idsInB = tableB.AsEnumerable().Select(row => (string)row["ID"]);
IEnumerable<string> bNotA = idsInB.Except(idsInA);
Run Code Online (Sandbox Code Playgroud)
我是否必须遍历每个DataTable上的每一行以检查它们是否相同.
看到你已经从CSV文件加载了数据,你就不会有任何索引或任何东西,所以在某些时候,某些事情必须遍历每一行,无论是代码还是库, 管他呢.
无论如何,这是一个算法问题,这不是我的专长,但我天真的方法如下:
1:您可以利用数据的任何属性吗?每个表中的所有行都是唯一的,您可以按相同的标准对它们进行排序吗?如果是这样,你可以这样做:
这允许你在(排序时间*2)+一次通过中进行,所以如果我的big-O-notation是正确的,那就是(无论什么时候排序)+ O(m + n)这是非常好的.
(修订版:这是ΤΖΩΤΖΙΟΥ描述的方法)
2:另一种方法,根据数据的大小,效率可能更高或更低:
我真的很想知道那些比我更熟悉算法知识的人为这一个提出了什么:-)
您可以在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
Run Code Online (Sandbox Code Playgroud)