当前位置:  开发笔记 > 编程语言 > 正文

比较两个DataTables以确定一个而不是另一个的行

如何解决《比较两个DataTables以确定一个而不是另一个的行》经验,为你挑选了3个好方法。

我有两个DataTable,A并且B是从CSV文件生成的.我需要能够检查哪些行B不存在A.

有没有办法进行某种查询来显示不同的行,还是我必须遍历每个DataTable上的每一行来检查它们是否相同?如果表格变大,后一种选择似乎非常密集.



1> Jon Skeet..:

假设你有一个适当类型的ID列(即给出一个哈希码并实现相等) - 在这个例子中的字符串,这是一个伪代码,因为我不熟悉DataTables并且没有时间查看所有内容刚才:)

IEnumerable idsInA = tableA.AsEnumerable().Select(row => (string)row["ID"]);
IEnumerable idsInB = tableB.AsEnumerable().Select(row => (string)row["ID"]);
IEnumerable bNotA = idsInB.Except(idsInA);



2> Orion Edward..:

我是否必须遍历每个DataTable上的每一行以检查它们是否相同.

看到你已经从CSV文件加载了数据,你就不会有任何索引或任何东西,所以在某些时候,某些事情必须遍历每一行,无论是代码还是库, 管他呢.

无论如何,这是一个算法问题,这不是我的专长,但我天真的方法如下:

1:您可以利用数据的任何属性吗?每个表中的所有行都是唯一的,您可以按相同的标准对它们进行排序吗?如果是这样,你可以这样做:

按照ID对两个表进行排序(使用一些有用的东西,比如quicksort).如果他们已经排序,那么你就赢了.

一次跳过两个表,跳过任一表中ID的任何间隙.匹配ID的平均重复记录.

这允许你在(排序时间*2)+一次通过中进行,所以如果我的big-O-notation是正确的,那就是(无论什么时候排序)+ O(m + n)这是非常好的.
(修订版:这是ΤΖΩΤΖΙΟΥ描述的方法)

2:另一种方法,根据数据的大小,效率可能更高或更低:

运行表1,对于每一行,将它的ID(或计算的哈希码,或该行的一些其他唯一ID)粘贴到字典中(如果您更喜欢将其称为哈希表).

运行表2,对于每一行,查看字典中是否存在ID(或哈希码等).你正在利用字典真的很快的事实 - 我认为O(1)?抬头.这一步将非常快,但您已经付出了所有这些字典插入的价格.

我真的很想知道那些比我更熟悉算法知识的人为这一个提出了什么:-)



3> MusiGenesis..:

您可以在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


使用Merge时,它不会标记DataRowState
推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有