2015-07-11 94 views
1

我不明白我的代码是如何出了错这里有一个代码块:parallel.foreach和字典集合

var filter=new dictionary<string,dictionary<string,bool>>(); 
//data here is of type dictionary<string,bool> 
Parallel.Foreach(data,t=> 
{ 
var filter1=data.Where(p=>p.Value).ToDictionary(p=>p.Key,p=>p.Value); 
filter.Add(t.key,filter1); 
}); 

有时候,最终过滤器中有一个空的关键,如果我用了这从来没有发生过一个简单的循环。

回答

3

如果我使用了简单的for循环,[这]从来没有发生过。

问题是,您正在同时添加到filter。您可以通过使用AsParallel()解决这个问题:

var filter = data.AsParallel().ToDictionary(t => 
    t.Key 
, data.Where(p=>p.Value).ToDictionary(p=>p.Key, p=>p.Value) 
); 
+0

谢谢你,工作,但你能告诉我为什么该方法的表现就像是,我就算是同时添加数据,有数据没有空的关键原因,那么并行类如何创建一些本不应该存在的虚构任务 – JokingBear

+0

@JokingBear当字典被同时修改时,其内部数据结构将变得无效,特别是当桶重新平衡时。并发更新会写入彼此的数据,因此即使非'null'项已提供给“Add”方法,键和/或值也会显示为“null”。事实上,你不能合法地向字典传递'null'键而不触发异常。 – dasblinkenlight