LINQ - Konwertuj listę na słownik z wartością jako listą

99

mam

List<MyObject> 

które pobieram z bazy danych. Chciałbym jednak, aby był on kluczowany przez właściwość w MyObject do celów grupowania. W jaki sposób LINQ najlepiej przesyła moją listę na:

Dictionary<long, List<MyObject>>

Mam:

myObjectList.ToDictionary(x => x.KeyedProperty)

Ale wraca:

Dictionary<long, MyObject>
Brandon
źródło
Chcesz, aby słownik był powiązany z właściwością JAKIEGO MyObject? - masz ich całą listę ...
James Curran

Odpowiedzi:

192

Wygląda na to, że chcesz pogrupować MyObjectinstancje według KeyedPropertyi umieścić tę grupę w pliku Dictionary<long,List<MyObject>>. Jeśli tak, spróbuj wykonać następujące czynności

List<MyObject> list = ...;
var map = list
  .GroupBy(x => x.KeyedProperty)
  .ToDictionary(x => x.Key, x => x.ToList());
JaredPar
źródło
16

Powinieneś użyć ToLookupmetody rozszerzenia na Enumerableklasie w następujący sposób:

List<MyObject> list = ...;

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

Jeśli chcesz umieścić to w słowniku, możesz użyć ToDictionarymetody rozszerzenia , na przykład:

IDictionary<long, IEnumerable<MyObject>> dictionary = lookup.ToDictionary(
    l => l.Key);
casperOne
źródło
Jaka jest różnica między tą a zaakceptowaną odpowiedzią? Czy ILookupzachowuje odniesienia, a zaakceptowana odpowiedź nie?
PatPeter
@PatPeter Chodzi o to, że gdy istnieje relacja jeden do wielu między kluczem a przedmiotami, a Lookup<TKey, TValue>może być lepszą strukturą niż Dictionary<TKey, TValue>.
casperOne
1
@PatPeter Powiedziałbym, że ILookup jest lepszą strukturą do użycia (jest jak multimap do mapy dictonary, jeśli znasz algorytmy kolekcji C ++), ale ma jeden ważny czynnik, o którym należy pamiętać - utworzone wyszukiwanie jest niezmienne. Nie możesz później dodawać ani usuwać wpisów.
gbjbaanb
Inną kwestią jest to, że chociaż ILookupczęsto jest to idealna struktura w kodzie, często nie jest dobrze obsługiwana w przypadku serializacji.
Jeff B