繁体   English   中英

删除数据表中的重复项

[英]remove duplicates in a datatable

我有以下实现在DataTable中查找重复项。 它效率极低,并且永久占用约2万行。 我只需要查找第二列值的重复条目:

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;
}

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

如果您不担心物理删除行,那么Mark Sowul的答案可能是一个更好的主意。

您遇到的问题是每一行都必须检查每隔一行,因此,随着行数的增加,检查的数量呈指数增长。 处理它的最快方法是使其线性化-仅执行与行数一样多的检查。

一种方法是按column2对数据表进行排序。 这会将所有重复项放在相邻的行中,因此您只需要遍历表,检查一行是否与下一行不匹配。

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

使用Dictionary并对所有值进行一次迭代,并计数每个值的出现=> Dictionary键是列值,Dictionary值是计数。 然后返回计数大于一的所有键。

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

DataTable distinctTable = originalTable.DefaultView.ToTable( /*distinct*/ true);

为了您的目的,您可以制作一个仅包含您感兴趣的列的DataView。

SQL比执行两次整个数据集要高效得多。

如果您要引用的列上有索引,则可以非常快地完成操作。

做就是了

SELECT id AS matchID, column1 FROM table1 WHERE column1 IN (SELECT column1 FROM table1 WHERE id IS NOT matchId)

或类似的东西

干杯,尼可

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM