使用字典进行重复数据删除的更好方法?

时间:2014-01-03 19:27:09

标签: c# multithreading dictionary

我获得了包含多个重复行的大量数据。 我想使用字典进行重复数据删除,然后将数据插入数据库。

row.key不能设置为DB主键。所以,我不能使用“DB主键无法复制”。

流程将是百万行。

我有两个计划,您认为哪个更快?

计划A:

try 
{
    dictionary.add(row);
    insert into DB
}
catch
{}

B计划:

if( ! dictionary.containskey(row.key) )
{
      dictionary.add(row);
      insert into DB
}

那么如果我在这个过程中使用多线程呢?这将是访问同一块的多个线程。这会安全有效吗?

4 个答案:

答案 0 :(得分:10)

首先,这里没有键/值关系,所以一组而不是一个映射是合适的。您应该使用HashSet而不是Dictionary来跟踪密钥。

接下来,查找基于散列的结构非常快,最重要的是,*不依赖于集合的大小。查找100万个项目HashSet与查找5个项目集一样快。这个常数值几乎肯定比依赖抛出的异常更快。

最后,Add的{​​{1}}方法表示是否添加了该项,因此您甚至根本不进行任何其他查找。

除此之外,除了性能不佳之外,使用控制流的异常也是不好的做法。出于代码清晰度的原因,您应该将异常用于真正特殊的情况。

答案 1 :(得分:5)

您可以使用HashSet<T>。它的Add方法返回一个bool,表示该项已经在其中。

if(hashSet.Add(row.key))
{
      insert into DB
}

答案 2 :(得分:1)

计划B应该更快,因为您实际上不必捕获异常。一般来说,B计划也是更好的风格,因为重复的密钥并不是真正的“例外”,它是预期的。

答案 3 :(得分:1)

第二个更快,但你应该使用HashSet,如下所示:

HashSet<string> hash = new HashSet<string>();
if(!hash.Contains(row.key))
{
   hash.Add(row.key);
   insert into DB
}