LINQ - Convertir lista en diccionario con valor como lista

99

tengo un

List<MyObject> 

que recupero de la base de datos. Sin embargo, me gustaría que tuviera una propiedad en MyObject con fines de agrupación. ¿Cuál es la mejor manera con LINQ para enviar mi lista a:

Dictionary<long, List<MyObject>>

Tengo lo siguiente:

myObjectList.ToDictionary(x => x.KeyedProperty)

Pero vuelve:

Dictionary<long, MyObject>
Brandon
fuente
¿Quiere que el diccionario esté codificado con una propiedad de QUÉ MyObject? - tienes una lista completa de ellos ....
James Curran

Respuestas:

191

Parece que desea agrupar las MyObjectinstancias KeyedPropertyy poner esa agrupación en un Dictionary<long,List<MyObject>>. Si es así, intente lo siguiente

List<MyObject> list = ...;
var map = list
  .GroupBy(x => x.KeyedProperty)
  .ToDictionary(x => x.Key, x => x.ToList());
JaredPar
fuente
16

Deberías usar el ToLookupmétodo de extensión en la Enumerableclase así:

List<MyObject> list = ...;

ILookup<long, MyObject> lookup = list.ToLookup(o => o.KeyedProperty);

Si desea colocar eso en un diccionario, entonces puede usar el ToDictionarymétodo de extensión , así:

IDictionary<long, IEnumerable<MyObject>> dictionary = lookup.ToDictionary(
    l => l.Key);
casperOne
fuente
¿Cuál es la diferencia entre esto y la respuesta aceptada? ¿ ILookupConserva las referencias mientras que la respuesta aceptada no?
PatPeter
@PatPeter La idea es que cuando tienes una relación de uno a varios entre la clave y los elementos, a Lookup<TKey, TValue>puede ser una estructura mejor que a Dictionary<TKey, TValue>.
casperOne
1
@PatPeter Yo diría que ILookup es la mejor estructura para usar (es como un mapa múltiple para el mapa de dictonary, si conoce los algoritmos de colección de C ++) pero tiene un gran factor a tener en cuenta: la búsqueda creada es inmutable. No puede agregar ni eliminar entradas posteriormente.
gbjbaanb
La otra consideración es que, aunque a ILookupmenudo es la estructura ideal en el código, a menudo no se maneja bien para la serialización.
Jeff B