Regroupement des Listes en Mémoire en C# avec LINQ et Expressions Lambda

Lorsque vous travaillez avec des listes en C#, vous pouvez rencontrer divers scénarios où vous devez regrouper des éléments en fonction d’une propriété spécifique. Par exemple, disons que vous avez une collection d’objets Foo, et vous souhaitez les organiser en fonction des valeurs de leurs propriétés Bar. C’est ici que la puissance de LINQ (Language Integrated Query) et des expressions lambda entre en jeu. Dans cet article, nous allons explorer comment regrouper des listes en mémoire en utilisant ces fonctionnalités de C# de manière efficace.

Comprendre le Problème

Imaginez que vous avez une liste d’objets Foo, où chaque Foo a des propriétés Bar et Lum. Certains instances de Foo peuvent partager la même valeur pour Bar. Votre objectif est de grouper ces instances de Foo par leurs valeurs de Bar, puis d’itérer sur les collections regroupées pour accéder à leurs valeurs Lum correspondantes. Cela peut améliorer l’organisation des données et faciliter la manipulation de jeux de données spécifiques.

Scénario d’Exemple

Considérons un exemple spécifique avec la liste suivante d’instances de Foo :

var foos = new List<Foo> {
   new Foo{Bar = 1,Lum = 1},
   new Foo{Bar = 1,Lum = 2},
   new Foo{Bar = 2,Lum = 3},
};

Résultat Souhaité

Nous voulons grouper ces instances de Foo par leurs valeurs de Bar, produisant finalement quelque chose comme :

  • Pour Bar = 1 : Lum = 1, Lum = 2
  • Pour Bar = 2 : Lum = 3

Solution en Utilisant LINQ

Vous pouvez grouper les objets Foo en utilisant la clause group by de LINQ. Voici comment cela peut être réalisé :

var groupedFoos = from foo in foos
                  group foo by foo.Bar into grouped
                  let lums = from g in grouped
                             select g.Lum
                  select new { Bar = grouped.Key, Lums = lums };

Étapes Expliquées

  • Grouper Par : La partie group foo by foo.Bar regroupe les instances de Foo en fonction de la propriété Bar.
  • Dans Regroupé : Cela crée un nouveau champ pour chaque groupe.
  • Sélectionner les Valeurs Lum : L’instruction let lums vous permet de créer une nouvelle collection composée des valeurs Lum des objets regroupés.
  • Sélection Finale : La sélection finale assemble tout dans un nouvel objet contenant la valeur Bar et sa liste correspondante de valeurs Lum.

Solution en Utilisant des Expressions Lambda

Alternativement, vous pouvez obtenir le même résultat en utilisant des expressions lambda, ce qui peut offrir une syntaxe plus concise. Voici comment :

var groupedFoos = foos.GroupBy(x => x.Bar)
                      .Select(y => new { Bar = y.Key, Lums = y.Select(z => z.Lum) });

Comment Cela Fonctionne

  • GroupBy : Cette méthode prend une fonction lambda pour spécifier la propriété par laquelle nous voulons grouper, à savoir x.Bar.
  • Select : Après le regroupement, nous utilisons Select pour créer un nouvel objet anonyme pour chaque groupe, contenant les valeurs Bar et les valeurs Lum correspondantes.

Itération à Travers les Données Regroupées

Que vous utilisiez LINQ ou des expressions lambda, l’itération à travers les données regroupées reste la même. Vous pouvez boucler à travers chaque groupe et imprimer les valeurs Lum comme suit :

foreach (var group in groupedFoos)
{
    Console.WriteLine("Lums pour Bar#" + group.Bar);
    foreach (var lum in group.Lums)
    {
        Console.WriteLine(lum);
    }
}

La Sortie Sera :

Lums pour Bar#1
1
2
Lums pour Bar#2
3

Conclusion

Le regroupement de listes en mémoire en utilisant LINQ ou des expressions lambda en C# est un moyen puissant d’organiser vos données. Que vous préfériez la lisibilité de la syntaxe LINQ ou la concision des expressions lambda, les deux approches vous permettront d’atteindre le regroupement souhaité de vos données de manière efficace.

Pour ceux qui souhaitent approfondir leur compréhension de LINQ, envisagez d’explorer 101 Exemples de LINQ pour des exemples plus complets.

Si vous avez des questions ou souhaitez partager vos expériences concernant le regroupement des données en C#, n’hésitez pas à laisser un commentaire ci-dessous !