LINQ - Convertir une liste en dictionnaire avec une valeur en tant que liste


99

j'ai un

List<MyObject> 

que je récupère de la base de données. Cependant, je voudrais qu'il soit associé à une propriété dans MyObject à des fins de regroupement. Quelle est la meilleure façon avec LINQ de diffuser ma liste sur:

Dictionary<long, List<MyObject>>

J'ai ce qui suit:

myObjectList.ToDictionary(x => x.KeyedProperty)

Mais ça revient:

Dictionary<long, MyObject>

Vous voulez que le dictionnaire soit associé à une propriété de QUEL MyObject? - vous en avez toute une liste ....
James Curran

Réponses:


191

Il semble que vous souhaitiez regrouper les MyObjectinstances par KeyedPropertyet placer ce groupe dans un fichier Dictionary<long,List<MyObject>>. Si tel est le cas, essayez ce qui suit

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

16

Vous devez utiliser la ToLookupméthode d'extension sur la Enumerableclasse comme ceci:

List<MyObject> list = ...;

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

Si vous souhaitez placer cela dans un dictionnaire, vous pouvez utiliser la ToDictionaryméthode d'extension , comme ceci:

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

Quelle est la différence entre cela et la réponse acceptée? Est-ce que les ILookupréférences conservent les références alors que la réponse acceptée ne le fait pas?
PatPeter le

@PatPeter L'idée est que lorsque vous avez une relation un-à-plusieurs entre la clé et les éléments, a Lookup<TKey, TValue>peut être une meilleure structure que a Dictionary<TKey, TValue>.
casperOne

1
@PatPeter Je dirais que ILookup est la meilleure structure à utiliser (c'est comme une multi-carte à la carte du dicton, si vous connaissez les algorithmes de collecte C ++) mais il a un gros facteur à garder à l'esprit - la recherche créée est immuable. Vous ne pouvez pas ajouter ou supprimer des entrées par la suite.
gbjbaanb

L'autre considération est que même si ILookupc'est souvent la structure de code idéale, elle n'est souvent pas bien gérée pour la sérialisation.
Jeff B le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.