2012-05-10 30 views
6

Tengo un List<MyClass>:C# Expandir lista plana <T> al diccionario <T, ICollection <int>>

public int MyClass 
{ 
    public int One { get; set; } 
    public int Two { get; set; } 
} 

Ahora, los datos pueden (y lo hace) el siguiente aspecto:

Uno : 1, dos: 9

Uno: 2, dos: 9

Uno: 1, dos: 8

uno: 3, dos: 7

ver cómo se muestra "Uno" dos veces? Quiero proyectar esta secuencia plana en una agrupado Dictionary<int,ICollection<int>>:

KeyValuePairOne: {Clave: 1, Valor: {9, 8}}

KeyValuePairTwo: {Clave: 2, Valor: {9}}

KeyValuePairThree: {clave: 3, Valor: {7}}

supongo que tengo que hacer una combinación de .GroupBy y .ToDictionary?

+0

Usted está en una buena dirección. ¿Qué has intentado? – SimpleVar

+1

sí, exactamente lo que haría –

+0

@Yorye - He intentado con un bucle feo, y sabía que no era la manera correcta de hacerlo, pero no sabía cómo acercarme al uso de '.GroupBy' y'. ToDictionary' juntos aquí, así que vine a la pila y pedí ayuda. :) – RPM1984

Respuesta

2
var list = new List<MyClass>(); 

var dictionary = list.GroupBy(x => x.One) 
        .ToDictionary(x => x.Key, x => x.ToArray()); 
+0

correcto, pero en realidad es 'x => x.Seleccione (y => y.Two) .ToArray()' en el '.ToDictionary> ', porque quiero terminar con un' Diccionario > 'not' Dictionary > ' – RPM1984

+0

Mi mal. Pero mientras tengas la solución, estoy feliz. – SimpleVar

+0

así soy yo. :) gracias y aceptado. – RPM1984

4

Esto es para lo que es el método de extensión ToLookup. Donde se lanzará ToDictionary si la clave aparece dos veces, ToLookup está bien y hace lo que estás buscando.

+0

ToLookup es más o menos como hacer GroupBy, que por sí solo no es suficiente como solución a la pregunta (hacer Diccionario de él) – SimpleVar

+0

@YoryeNathan es más conciso que GroupBy: una frase en lugar de dos. Además, su respuesta * es exactamente eso *: hacer un GroupBy, por lo que evidentemente cree que es suficiente (o al menos es la mejor solución). – McGarnagle

+0

GroupBy es correcto, pero con la adición de ToDictionary. ToLookup con la adición de ToDictionary también funciona. Que, por cierto, no es más corto de ninguna manera. Todo lo que digo es que todavía necesitarás ToDictionary ya que el OP quería un diccionario. – SimpleVar

0

Así es exactamente como usted lo haría:

Dictionary<int, List<MyClass>> result = 
    items.GroupBy(x => x.One).ToDictionary(x => x.Key, x => x.ToList()); 
+0

ahhh, eso es todo ... (creo) ... tratando ahora ... – RPM1984

+2

¿Por qué no usar var? Además, .ToArray() también hará ICollection, y es más eficiente. Debe hacer una lista solo si tiene la intención de usar Agregar/Eliminar en ICollection. – SimpleVar

+0

verdadero y verdadero .. – RPM1984

Cuestiones relacionadas