删除数据表中的重复项

时间:2011-03-10 14:50:13

标签: c# algorithm datatable

我有以下实现来查找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;
}

5 个答案:

答案 0 :(得分:1)

您可以进行的一项优化是对已排序的数据集执行重复数据删除。定义一个DataView,对相关列上的数据进行排序,然后只检查当前行的值是否与前一行的值不同。

Mark Sowul的答案可能是一个更好的主意,如果你不打算去除物理上的行。

答案 1 :(得分:1)

你遇到的问题是每一行都必须检查每一行,所以对于更多的行,检查的数量呈指数增长。处理它的最快方法是使其成为线性的 - 只做与行数一样多的检查。

执行此操作的一种方法是按column2对数据表进行排序。这将在相邻的行中放置任何重复项,因此您只需要检查一行检查一行是否与下一行不匹配。

另一种方法是从源头获取内容,并在阅读之前确保行是不同的。

答案 2 :(得分:1)

使用字典并在所有值上迭代一次并计算每个值的出现次数=&gt;字典键是列值,字典值是计数。 然后返回count不止一个的所有键。

答案 3 :(得分:0)

来自:http://social.msdn.microsoft.com/Forums/en/adodotnetdataset/thread/ed9c6a6a-a93e-4bf5-a892-d8471b84aa3b

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)

或类似的东西

干杯, 尼科