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>

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());

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);

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.