203 votes

LINQ Regroupement par dans un objet Dictionary

Je tente d'utiliser LINQ pour créer un Dictionary> à partir d'une List. Je peux y arriver en utilisant "var", mais je ne veux pas utiliser des types anonymes. Voici ce que j'ai

var x = (from CustomObject o in ListOfCustomObjects
      group o by o.PropertyName into t
      select t.ToList());

J'ai également essayé d'utiliser Cast<>() de la bibliothèque LINQ une fois que j'ai x, mais j'obtiens des erreurs de compilation indiquant que c'est un cast invalide.

0 votes

Que se passerait-il si vous essayiez var x = (from CustomObject o in ListOfCustomObjects group o by o.PropertyName into t select t).ToList();

53 votes

Y a-t-il une raison pour laquelle vous devez faire cela plutôt que d'utiliser ToLookup, qui est conçu pour cela?

1 votes

Jon, pourriez-vous s'il vous plaît poster un exemple de comment fonctionne ToLookup dans cette situation? Je ne suis pas familier avec cette méthode LINQ.

448voto

Yuriy Faktorovich Points 33347
Dictionnaire> monDictionnaire = ListeDObjetsPersonnalisés
    .GroupBy(o => o.NomDePropriété)
    .ToDictionary(g => g.Key, g => g.ToList());

6 votes

À moins que vous n'ayez besoin d'une propriété de 'CustomObject' en tant que valeur de la liste (non affichée dans cette réponse), il vaut la peine de vérifier le commentaire codeliness de Jon Skeet à la question recommandant ToLookup().

3 votes

C'est ainsi qu'il faut procéder si un résultat non immuable est souhaité. ToLookup est immuable.

1 votes

Mes 2 cents (juste parce que ça m'a fait galérer pendant une heure :) ) : lors de regroupement par une propriété, assurez-vous que la propriété A une valeur ! Sinon, la méthode Todict échoue à générer une clé (pour les propriétés de type String du moins...) :)

39voto

RuudvK Points 303

Je ne peux pas commenter sur @Michael Blackburn, mais je suppose que tu as reçu le downvote parce que le GroupBy n'est pas nécessaire dans ce cas.

Utilise-le ainsi :

var lookupOfCustomObjects = listOfCustomObjects.ToLookup(o=>o.PropertyName);
var listWithAllCustomObjectsWithPropertyName = lookupOfCustomObjects[propertyName]

De plus, j'ai vu que cela fonctionne beaucoup mieux que lorsque l'on utilise GroupBy().ToDictionary().

3voto

Michael Blackburn Points 589

Pour @atari2600, voici à quoi ressemblerait la réponse en utilisant ToLookup dans la syntaxe lambda :

var x = listOfCustomObjects
    .GroupBy(o => o.PropertyName)
    .ToLookup(customObject => customObject);

Fondamentalement, cela prend l'IGrouping et le matérialise pour vous dans un dictionnaire de listes, avec les valeurs de PropertyName comme clé.

-1voto

Cela pourrait vous aider si vous voulez obtenir un compte des mots. Si vous voulez une clé et une liste d'éléments, il suffit de modifier le code pour que la valeur soit group.ToList()

    var s1 = "le meilleur restaurant italien profitez des meilleures pâtes";    
    var D1Count = s1.ToLower().Split(' ').GroupBy(e => e).Select(group => new { key = group.Key, value = group.Count() }).ToDictionary(e => e.key, z => z.value);

//afficher les résultats
                    Console.WriteLine(D1Count["le"]);
                    foreach (var item in D1Count)
                    {
                        Console.WriteLine(item.Key +" "+ item.Value);
                    }

-3voto

Leo Barbas Points 53

Le suivant a fonctionné pour moi.

var temp = ctx.Set()
  .GroupBy(g => new { g.id })
  .ToDictionary(d => d.Key.id);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X