2010-09-22 6 views
1

J'ai un objet qui ressemble à ceci:Comment obtenir un Dictionary <string, Liste <Object> avec LINQ?

class Model 
{ 
    public string Category {get;set;} 
    public string Description {get;set;} 
} 

Actuellement, je reçois la liste complète de ces objets avec LINQ, puis configurer manuellement un dictionnaire, comme ceci:

List<Model> models = //get list from repository and then with linq order them by category and description 

Dictionary<string, List<Model>> dict= new Dictionary<string, List<Model>>(); 

      foreach (var m in models)   { 
       if (dict.ContainsKey(m.Category)) 
       { 
        dict[m.Category].Add(m); 
       } 
       else 
       { 
        dict.Add(m.Category, new List<Model> { m }); 
       }  
      } 

cette façon dont je peux accéder à tous les modèles d'une certaine catégorie en utilisant les touches.

Existe-t-il un moyen de générer le dictionnaire directement avec une requête LINQ?

Merci!

Répondre

5

Avez-vous vu la classe Lookup? (msdn)

Vous pouvez créer avec un appel à la méthode (msdn)

Il est fondamentalement exactement ce que vous voulez Enumerable.ToLookup() ici, et gère les clés de Dupe.

+0

+1 pour plus de simplicité. –

+0

Regardez les informations sur la classe Lookup; vous devez l'énumérer légèrement différemment puisqu'il s'agit d'une collection spéciale dans une collection. –

5

oui il y a une façon de cela, mais pour obtenir ce fait, vous aurez besoin de les regrouper d'abord (pour éviter les clés en double):

var dict = (from model in models 
      group model by model.Category into g 
      select g).ToDictionary(x => x.Key, x => x.ToList()); 

(Pendant que vous y êtes, je me demande ce que le (

0

Vous pouvez utiliser Aggregate() pour masquer la logique foreach, mais comme l'OP à qui j'ai suggéré pour la dernière fois, c'est une boucle dans les vêtements Linq.

Qu'en est-:

var myDictionary = (from m in models 
        group m by m.Category into theGroup 
        select new {Key = m.Category, Value = theGroup.ToList())) 
        .ToDictionary(x=>x.Key, x=>x.Value); 
Questions connexes