2010-12-02 12 views

Respuesta

31

La clase ConcurrentDictionary<K,V> implementa la interfaz IDictionary<K,V>, que debería ser suficiente para la mayoría de los requisitos. Pero si usted realmente necesita un hormigón 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); 
+4

Tenga en cuenta que el diccionario para copiar podría usar un 'IEqualityComparer' no predeterminado que no se conservará de esa manera. Mejor: 'var newDict = dict.ToDictionary (kvp => kvp.Key, kvp => kvp.Value, dict.Comparer);' –

+2

Tenga en cuenta que [MSDN] (https://msdn.microsoft.com/en -us/library/system.collections.concurrent (v = vs.110) .aspx) dice que esto puede no ser seguro para subprocesos. ¿Cómo lo harías seguro? – JonDrnek

+0

No se preocupe, en realidad es seguro para subprocesos, en virtud de ConcurrentDictionary. Obtendrás una instantánea del contenido de ConcurrentDictionary. Sin embargo, el diccionario que obtienes de eso no será seguro para subprocesos más adelante. – Falanwe

9

¿Por qué es necesario convertirlo a un diccionario? ConcurrentDictionary<K, V> implementa la interfaz IDictionary<K, V>, ¿no es suficiente?

Si realmente necesita un Dictionary<K, V>, puede copiar usando LINQ:

var myDictionary = myConcurrentDictionary.ToDictionary(entry => entry.Key, 
                 entry => entry.Value); 

Tenga en cuenta que esto hace una copia . Usted no puede simplemente asigne un ConcurrentDictionary a un Diccionario, ya que ConcurrentDictionary no es un subtipo de Diccionario. Ese es el objetivo de interfaces como IDictionary: puede abstraer la interfaz deseada ("algún tipo de diccionario") de la implementación concreta (hashmap concurrente/no concurrente).

0
ConcurrentDictionary<int, string> cd = new ConcurrentDictionary<int, string>(); 
Dictionary<int,string> d = cd.ToDictionary(pair => pair.Key, pair => pair.Value); 
3

creo que he encontrado una manera de hacerlo.

ConcurrentDictionary<int, int> concDict= new ConcurrentDictionary<int, int>(); 
Dictionary dict= new Dictionary<int, int>(concDict); 
Cuestiones relacionadas