我有以下实现来查找DataTable中的重复项。这是非常低效的,并且需要大约20K行。我只需要找到第二列值的重复条目:
private List<string> checkForDuplicates(DataTable results)
{
List<string> duplicateLists = new List<string>();
for (int i = 0; i < results.Rows.Count; i++ )
{
string cellvalue = results.Rows[i][1].ToString();
for (int j = 0; j < results.Rows.Count; j++)
{
if (i != j)
{
if (cellvalue.Equals(results.Rows[j][1]))
{
//Duplicate found
duplicateLists.Add(results.Rows[i][1].ToString() + "_" + i+2 + "_" + j+2);
}
}
}
}
return duplicateLists;
}
答案 0 :(得分:1)
您可以进行的一项优化是对已排序的数据集执行重复数据删除。定义一个DataView,对相关列上的数据进行排序,然后只检查当前行的值是否与前一行的值不同。
Mark Sowul的答案可能是一个更好的主意,如果你不打算去除物理上的行。
答案 1 :(得分:1)
你遇到的问题是每一行都必须检查每一行,所以对于更多的行,检查的数量呈指数增长。处理它的最快方法是使其成为线性的 - 只做与行数一样多的检查。
执行此操作的一种方法是按column2对数据表进行排序。这将在相邻的行中放置任何重复项,因此您只需要检查一行检查一行是否与下一行不匹配。
另一种方法是从源头获取内容,并在阅读之前确保行是不同的。
答案 2 :(得分:1)
使用字典并在所有值上迭代一次并计算每个值的出现次数=&gt;字典键是列值,字典值是计数。 然后返回count不止一个的所有键。
答案 3 :(得分:0)
DataTable distinctTable = originalTable.DefaultView.ToTable( /*distinct*/ true);
出于您的目的,您可以制作仅包含您感兴趣的列的DataView。
答案 4 :(得分:0)
SQL可以更有效地执行此操作,而不是将整个数据集拉两次。
如果您所指的列上有索引,则可以非常快速地执行此操作。
只做
SELECT id AS matchID, column1 FROM table1 WHERE column1 IN (SELECT column1 FROM table1 WHERE id IS NOT matchId)
或类似的东西
干杯, 尼科