如何将ConcurrentDictionary转换为Dictionary?

umb*_*sar 23 .net c# dictionary concurrentdictionary

我有一个ConcurrentDictionary对象,我想将其设置为Dictionary对象.

不允许在他们之间施放.那我该怎么做?

Luk*_*keH 37

ConcurrentDictionary<K,V>类实现了IDictionary<K,V>接口,这足以满足大多数要求.但如果你真的需要具体Dictionary<K,V>......

var newDictionary = yourConcurrentDictionary.ToDictionary(kvp => kvp.Key,
                                                          kvp => kvp.Value,
                                                          yourConcurrentDictionary.Comparer);

// or...
// substitute your actual key and value types in place of TKey and TValue
var newDictionary = new Dictionary<TKey, TValue>(yourConcurrentDictionary, yourConcurrentDictionary.Comparer);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,要复制的字典可能使用不会以这种方式保留的非默认`IEqualityComparer`!更好:`var newDict = dict.ToDictionary(kvp => kvp.Key,kvp => kvp.Value,dict.Comparer);` (6认同)
  • @Falanwe:它是安全的,但你没有获得内容的快照:_"从字典返回的枚举器可以安全地与字典的读写一起使用,但它并不代表片刻的时刻字典的时间快照.通过枚举器公开的内容可能包含在调用GetEnumerator后对字典所做的修改."_(来自https://msdn.microsoft.com/en-us/library/dd287131的_Remarks_部分. ASPX) (5认同)
  • 请注意,[MSDN](https://msdn.microsoft.com/en-us/library/system.collections.concurrent(v = vs.110).aspx)表示这可能不是线程安全的.你会如何使其线程安全? (2认同)

Hei*_*nzi 13

为什么需要将其转换为字典?ConcurrentDictionary<K, V>实现IDictionary<K, V>接口,是不够的?

如果你真的需要Dictionary<K, V>,你可以使用LINQ 复制它:

var myDictionary = myConcurrentDictionary.ToDictionary(entry => entry.Key,
                                                       entry => entry.Value);
Run Code Online (Sandbox Code Playgroud)

请注意,这是一个副本.您不能只将ConcurrentDictionary分配给Dictionary,因为ConcurrentDictionary不是Dictionary的子类型.这就是IDictionary这样的接口的全部要点:您可以从具体实现(并发/非并发hashmap)中抽象出所需的接口("某种字典").


umb*_*sar 7

我想我已经找到了办法.

ConcurrentDictionary<int, int> concDict= new ConcurrentDictionary<int, int>( );
Dictionary dict= new Dictionary<int, int>( concDict);
Run Code Online (Sandbox Code Playgroud)