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

Ben*_* Ae 1 c# multithreading dictionary

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

row.key不能被设置为DB的主键.所以,我不能使用"DB主键无法复制".

流程将是百万行.

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

计划A:

try 
{
    dictionary.add(row);
    insert into DB
}
catch
{}
Run Code Online (Sandbox Code Playgroud)

B计划:

if( ! dictionary.containskey(row.key) )
{
      dictionary.add(row);
      insert into DB
}
Run Code Online (Sandbox Code Playgroud)

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

Ser*_*rvy 10

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

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

最后,a的Add方法HashSet指示是否添加了项目,因此您甚至根本不进行任何其他查找.

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


L.B*_*L.B 5

你可以用HashSet<T>.它的Add方法返回一个bool,表明该项已经在其中.

if(hashSet.Add(row.key))
{
      insert into DB
}
Run Code Online (Sandbox Code Playgroud)