2009-02-17 9 views
27

Tengo el siguiente diccionario:¿Cómo obtengo todos los valores de un Diccionario <TKey, TValue> como IList <TValue>?

IDictionary<int, IList<MyClass>> myDictionary 

y estoy deseando conseguir todos los valores en el diccionario como un IList ....


sólo para añadir un poco de un fondo en cuanto a cómo he llegado a esta situación ....

Tengo un método que me da una lista de MyClass. Luego tengo otro método que convierte esa lista en un diccionario donde la clave es la identificación para MyClass. Más adelante ... y sin acceso a esa lista original ... Necesito obtener la lista desagrupada original de MyClass.


Cuando paso myDictionary.Values.ToList() para un método que toma un IList me sale un error de compilación que dice que no se puede convertir de

System.Collections.Generic.List<System.Collections.Generic.IList<MyClass>> 

a:

System.Collections.Generic.IList<MyClass> 

Ahora, puedo entender que ya no está y agregué cada uno de los grupos de IList a la nueva lista como elementos separados de la lista ... pero en este caso no es lo que busco. Solo quiero una lista de todos los valores en todo el diccionario.

¿Cómo puedo obtener lo que quiero sin pasar por cada uno de los valores clave en el diccionario y crear la lista que quiero?

+1

creo que tu pregunta podría haber sido puesto a punto para decir "Sólo quiero una lista de todos los elementos de las listas que están contenidos en las claves de un diccionario". Una lista de todos los valores en el diccionario (lo que solicitó) es exactamente lo que estaba obteniendo: una lista de listas. –

Respuesta

39

Debido a la forma en que se mantiene un diccionario (o tabla hash) esto es lo que haría. Internamente, la implementación contiene claves, cubos (para el manejo de colisiones) y valores. Usted puede ser capaz de recuperar la lista de valores interno pero usted es mejor con algo como esto:

IDictionary<int, IList<MyClass>> dict; 
var flattenList = dict.SelectMany(x => x.Value); 

Se debe hacer el truco;) SelectMany aplana el resultado que significa que cada lista se concatenan en una secuencia larga (IEnumerable`1).

0

Values obtiene un ICollection que contiene los valores de su diccionario. Tal como lo implica la definición de su diccionario, se puede definir como una colección ICollection<IList<MyClass>>. Entonces, si realmente quiere un IList<IList<MyClass>>, use la solución spacedog.

Si lo que realmente quiere es un `IList plana', entonces no hay otra solución que bucle a través de cada valor:

IList<MyClass> l=new List<MyClass>(); 
foreach (IList<MyClass> v in myDictionary.Values) 
    l.AddRange(v); 

Tenga en cuenta que esto es así muy ineficiente que debe pensar de nuevo sobre el uso de una diccionario de lo que estás tratando de lograr.

20

Una variación en la sugerencia de John:

var flattenedValues = dict.Values.SelectMany(x => x); 

Si los necesita en una lista, por supuesto, puedes llamada ToList:

var flattenedList = dict.Values.SelectMany(x => x).ToList(); 
+0

Ah sí, pensé que la propiedad Values ​​no era accesible a través de la interfaz IDictionary'2. –

44

notado una gran cantidad de respuestas eran bastante antiguo.

Esto también funciona:

dict.Values.ToList(); 
+0

Esto funcionó para mí – Ziggler

+0

Muy simple, la respuesta debería cambiarse a esto. – rolls

+4

@rolls No, porque 'dict.Values.ToList()' no es lo mismo que 'dict.Values.SelectMany (x => x)' esto último da como resultado una lista de listas, mientras que 'SelectMany' aplana y concatena el resultado listas en una sola secuencia. –

Cuestiones relacionadas