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 deFoo
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 valeursLum
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 valeursLum
.
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 valeursBar
et les valeursLum
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 !