Créer un dictionnaire sur une liste avec regroupement

J’ai l’object suivant dans une liste:

public class DemoClass { public int GroupKey { get; set; } public ssortingng DemoSsortingng { get; set; } public object SomeOtherProperty { get; set; } } 

Maintenant, je veux créer le dictionnaire suivant:

 Dictionary<int, List> 

Je veux grouper la List par la propriété GroupKey , mais je ne comprends pas comment cela est fait et de l’aide.

Après avoir réfléchi un peu, j’ai réalisé le comportement nécessaire avec:

 var groupedDemoClasses = from demoClass in mySepcialVariableWhichIsAListOfDemoClass group demoClass by demoClass.GroupKey into groupedDemoClass select groupedDemoClass; var neededDictionary = groupedDemoClass.ToDictionary(gdc => gdc.Key, gdc => gdc.ToList()); 

mais y a-t-il un moyen d’en faire une déclaration unique?

 var groupedDemoClasses = (from demoClass in mySepcialVariableWhichIsAListOfDemoClass group demoClass by demoClass.GroupKey into groupedDemoClass select groupedDemoClass).ToDictionary(gdc => gdc.Key, gdc => gdc.ToList()); 

Celui-ci va travailler !!!

Juste pour faire la suggestion de mquander concrètement:

 var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass .GroupBy(x => x.GroupKey) .ToDictionary(gdc => gdc.Key, gdc => gdc.ToList()); 

Vous pourriez le raccourcir si vous utilisiez des noms de variables plus courts, bien sûr 🙂

Cependant, pourrais-je suggérer qu’une recherche soit plus appropriée? Une recherche est essentiellement un dictionnaire depuis une clé vers un IEnumerable – à moins que vous ayez vraiment besoin des valeurs sous forme de liste, cela rend le code encore plus court (et plus efficace) avec l’appel ToLookup :

 var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass .ToLookup(x => x.GroupKey); 

Vous en avez déjà fait un one-liner. Il suffit de mettre le ToDictionary à la fin de votre première ligne. Si vous voulez qu’il soit plus court, utilisez la syntaxe de composition fonctionnelle au lieu de la syntaxe de requête.

Je vais un peu hors sujet ici, mais je suis arrivé à ce sujet car je cherchais un moyen de créer un dictionnaire d’un dictionnaire dans Linq, et la conversation ici me mène à la réponse …

Vous pouvez utiliser linq pour créer des dictionnaires à plusieurs niveaux, ce qui est utile pour les scénarios dans lesquels vous souhaitez rechercher plus d’une clé ou dimension. L’astuce consiste à créer un regroupement puis à le convertir en dictionnaire, comme suit:

  Dim qry = (From acs In ActualSales _ Group By acs.ProductID Into Group _ Select ProductID, Months = Group.ToDictionary(Function(c) c.Period) _ ).ToDictionary(Function(c) c.ProductID) 

La requête résultante peut être utilisée comme suit:

  If qry.ContainsKey(_ProductID) Then With qry(_ProductID) If .Months.ContainsKey(_Period) Then ... End If End With End If 

J’espère que cela est utile à quiconque a besoin de ce type de requête.