LINQ - Converti elenco in dizionario con valore come elenco


99

Ho un

List<MyObject> 

che recupero dal database. Tuttavia, vorrei che fosse codificato da una proprietà in MyObject per scopi di raggruppamento. Qual è il modo migliore con LINQ per trasmettere il mio elenco a:

Dictionary<long, List<MyObject>>

Ho il seguente:

myObjectList.ToDictionary(x => x.KeyedProperty)

Ma ritorna:

Dictionary<long, MyObject>

Vuoi che il dizionario sia codificato in una proprietà di QUALE mio oggetto? - hai un intero elenco di loro ...
James Curran

Risposte:


192

Sembra che tu voglia raggruppare le MyObjectistanze per KeyedPropertye mettere quel raggruppamento in un file Dictionary<long,List<MyObject>>. In tal caso, provare quanto segue

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

16

Dovresti usare il ToLookupmetodo di estensione sulla Enumerableclasse in questo modo:

List<MyObject> list = ...;

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

Se vuoi inserirlo in un dizionario, puoi usare il ToDictionarymetodo di estensione , in questo modo:

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

Qual è la differenza tra questa e la risposta accettata? Condivide la ILookupconservano riferimenti, mentre la risposta accettata non lo fa?
PatPeter

@PatPeter L'idea è che quando si ha una relazione uno-a-molti tra la chiave e gli elementi, a Lookup<TKey, TValue>potrebbe essere una struttura migliore di a Dictionary<TKey, TValue>.
casperOne

1
@PatPeter direi che ILookup è la struttura migliore da usare (è come la mappa multimappa per la mappa di dictonary, se conosci gli algoritmi di raccolta C ++) ma ha un grande fattore da tenere a mente: la ricerca creata è immutabile. Non è possibile aggiungere o rimuovere voci in seguito.
gbjbaanb

L'altra considerazione è che, sebbene ILookupsia spesso la struttura in-code ideale, spesso non viene gestita bene per la serializzazione.
Jeff B
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.