LINQ - Converter lista em dicionário com valor como lista


99

eu tenho um

List<MyObject> 

que recupero do banco de dados. No entanto, gostaria que fosse codificado por uma propriedade em MyObject para fins de agrupamento. Qual é a melhor maneira com o LINQ de lançar minha lista para:

Dictionary<long, List<MyObject>>

Eu tenho o seguinte:

myObjectList.ToDictionary(x => x.KeyedProperty)

Mas retorna:

Dictionary<long, MyObject>

Você quer o dicionário codificado para uma propriedade de QUE MyObject? - você tem uma lista completa deles ....
James Curran

Respostas:


191

Parece que você deseja agrupar as MyObjectinstâncias por KeyedPropertye colocar esse agrupamento em um Dictionary<long,List<MyObject>>. Se sim, tente o seguinte

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

16

Você deve usar o ToLookupmétodo de extensão na Enumerableclasse assim:

List<MyObject> list = ...;

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

Se quiser colocar isso em um dicionário, você pode usar o ToDictionarymétodo de extensão , assim:

IDictionary<long, IEnumerable<MyObject>> dictionary = lookup.ToDictionary(
    l => l.Key);

Qual é a diferença entre esta e a resposta aceita? A ILookupresposta preserva as referências e a resposta aceita, não?
PatPeter

@PatPeter A ideia é que, quando você tem um relacionamento um-para-muitos entre a chave e os itens, a Lookup<TKey, TValue>pode ser uma estrutura melhor do que a Dictionary<TKey, TValue>.
casperOne

1
@PatPeter eu diria que o ILookup é a melhor estrutura a ser usada (é como multimapa para o mapa do dicionário, se você conhece algoritmos de coleção C ++), mas tem um grande fator a ter em mente - a pesquisa criada é imutável. Você não pode adicionar ou remover entradas posteriormente.
gbjbaanb

A outra consideração é que, embora ILookupfrequentemente seja a estrutura ideal no código, geralmente não é bem tratada para serialização.
Jeff B
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.