2010-12-29 19 views
34

Sé que es posible convertir una Lista de KeyValuePair en un Diccionario, pero ¿hay una manera rápida (además de realizar un bucle manualmente) para realizar la operación viceversa?Convertir diccionario a List <KeyValuePair>

Esta sería la forma manual,

foreach (KeyValuePair<double,double> p in dict) 
{ 
    list.Add(new KeyValuePair<double,double>(p.Key,p.Value)); 
} 

En realidad, no es tan malo, pero yo era sólo curiosidad.

+2

no necesita crear nuevos KeyValuePairs; esto es mucho más simple: 'foreach (KeyValuePair p en dict) {list.Add (p); } ' – phoog

Respuesta

79

Para convertir un Dictionary<TKey, TValue> a un List<KeyValuePair<TKey, TValue>> que pueda decir

var list = dictionary.ToList(); 

o la más prolija

var list = dictionary.ToList<KeyValuePair<TKey, TValue>>(); 

Esto se debe a Dictionary<TKey, TValue> implementa IEnumerable<KeyValuePair<TKey, TValue>>.

+8

Vale la pena señalar que debe agregar' System.Linq; 'como un uso. – Harry

+1

Esto se debe marcar como respuesta –

8

mediante LINQ: Elementos

myDict.ToList<KeyValuePair<double, double>>(); 

diccionario sonKeyValuePair artículos.

5

Me gusta Jason said. Pero si realmente no necesita una lista, puede simplemente enviarla a una ICollection < TKey, TValue > porque implementa esta interfaz, pero algunas partes solo de forma explícita. Este método funciona mejor porque no copia toda la lista, solo reutiliza la misma instancia de diccionario.

+0

'ToList' simplemente copia las referencias a los elementos del diccionario. Esto es sorprendentemente rápido y muy poco probable que sea un problema de rendimiento relevante. – jason

+2

El lanzamiento es infinitamente más rápido. Lo cual no se nota si lo haces solo unas pocas veces con listas pequeñas, pero aún así, sí importa mucho. – fejesjoco

+1

@Jason: No es cierto. Una llamada al método de extensión Enumerable.ToList > es potencialmente costoso. Desde otra perspectiva, debe devolver una nueva lista; de lo contrario, podría agregar elementos al diccionario agregando elementos a la lista, lo que sería extraño. – JBSnorro

0

para .NET 2.0:

Dictionary<TKey, TValue> dictionary = new Dictionary<TKey, TValue>(); 
List<KeyValuePair<TKey, TValue>> myList = new List<KeyValuePair<TKey, TValue>>(dictionary); 
0

He estado tratando de enumerar una instancia de Exception.Data que es un IDictionary. Esto es lo que finalmente funcionó:

ICollection keys = idict.Keys; 
    foreach(var key in keys) 
    { 
     var value = idict[key]; 
     Console.WriteLine("{0}: {1}", key, value); 
    } 
Cuestiones relacionadas