【问题标题】:Getting Dictionary<K,V> from ConcurrentDictionary<K,V> in .NET 4.0从 .NET 4.0 中的 ConcurrentDictionary<K,V> 获取 Dictionary<K,V>
【发布时间】:2010-10-19 22:29:42
【问题描述】:

我正在并行化一些后端代码并尽量不破坏接口。我们有几种返回 Dictionary 的方法,在内部,我使用 ConcurrentDictionary 来执行并行操作。

从这些返回字典的最佳方法是什么?

这感觉太简单了:

return myConcurrentDictionary.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

我觉得我错过了什么。

【问题讨论】:

    标签: collections concurrency dictionary .net-4.0 parallel-processing


    【解决方案1】:

    Constructing the Dictionary&lt;K,V&gt; directly 将比调用ToDictionary稍微更有效率。构造函数会将目标字典预先分配到正确的大小,并且不需要随时调整大小。

    return new Dictionary<K,V>(myConcurrentDictionary);
    

    如果您的ConcurrentDictionary&lt;K,V&gt; 使用自定义IEqualityComparer&lt;K&gt;,那么您可能想要pass that into the constructor too

    【讨论】:

    • 哦,我不知道。好资料!
    • 如果在构建新字典时向字典中添加或删除项目,这会起作用吗?
    • @supercat:是的,没关系。 “从字典返回的枚举器可以安全地与对字典的读取和写入同时使用,但它并不代表字典的即时快照。通过枚举器公开的内容可能包含对字典的修改GetEnumerator 之后的字典被调用。" msdn.microsoft.com/en-us/library/dd287131.aspx
    • 能否保证在枚举过程中删除并重新添加的项在构建新字典时不会造成键冲突?
    • @supercat:我不是专家,但我很确定没有任何保证。如果我尝试这样做,我预计会出现某种运行时异常。
    【解决方案2】:

    不。这完全没问题。 .NET 序列就是这样。 :D

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 2017-07-03
      • 1970-01-01
      • 2011-04-21
      相关资源
      最近更新 更多