Group by dans LINQ : 5 questions qui tourmentent les débutants

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Group by dans LINQ : comprendre le regroupement avec des exemples concrets

\n\n

Si vous avez déjà écrit des requêtes sur des collections en C#, vous avez sûrement rencontré la question : « Comment puis-je regrouper des données ? ». Le sujet group by in LINQ est l’un des plus populaires sur Stack Overflow (des dizaines de milliers de vues). Et ce n’est pas un hasard : le regroupement semble simple seulement à première vue. En réalité, les débutants butent sur des pièges typiques : comment sélectionner le premier enregistrement dans un groupe, comment calculer une somme ou faire un regroupement imbriqué.

\n\n

Dans cet article, nous allons analyser les 5 questions les plus fréquentes sur LINQ GroupBy et donner des réponses qui fonctionnent. C’est parti !

\n\n

1. Comment fonctionne GroupBy dans LINQ ? Syntaxe de base

\n\n

La méthode GroupBy est l’équivalent de l’opérateur SQL GROUP BY. Elle divise une séquence en groupes selon une clé donnée. Le résultat est une collection d’objets IGrouping<TKey, TElement>, où chaque objet contient la clé et tous les éléments appartenant à ce groupe.

\n\n

Voici un exemple très simple. Supposons que nous ayons une liste d’étudiants :

\n\n
public class Student\n{\n    public string Name { get; set; }\n    public string Group { get; set; }\n    public int Score { get; set; }\n}\n\nvar students = new List<Student>\n{\n    new Student { Name = "Anna", Group = "A", Score = 85 },\n    new Student { Name = "Boris", Group = "B", Score = 90 },\n    new Student { Name = "Vika", Group = "A", Score = 78 },\n    new Student { Name = "Gleb", Group = "B", Score = 92 }\n};
\n\n

Regroupons par nom de groupe :

\n\n
var grouped = students.GroupBy(s => s.Group);\n\nforeach (var group in grouped)\n{\n    Console.WriteLine($"Groupe : {group.Key}");\n    foreach (var student in group)\n    {\n        Console.WriteLine($"  {student.Name} — {student.Score}");\n    }\n}
\n\n

Résultat :

\n
Groupe : A\n  Anna — 85\n  Vika — 78\nGroupe : B\n  Boris — 90\n  Gleb — 92
\n\n

Tout est simple. Mais le diable, comme toujours, se cache dans les détails.

\n\n

2. Comment sélectionner le premier enregistrement de chaque groupe ?

\n\n

C’est la question la plus fréquente sur group by in LINQ. Supposons que nous devions obtenir le meilleur étudiant de chaque groupe (avec le score maximum). Comment faire ?

\n\n

La solution — combiner GroupBy avec First() ou OrderByDescending :

\n\n
var bestStudents = students\n    .GroupBy(s => s.Group)\n    .Select(g => g.OrderByDescending(s => s.Score).First());\n\nforeach (var student in bestStudents)\n{\n    Console.WriteLine($"{student.Name} — {student.Group} — {student.Score}");\n}
\n\n

Résultat : Anna (85) et Gleb (92). Notez : à l’intérieur de Select, nous trions le groupe et prenons le premier élément. C’est la réponse à la question « comment faire LINQ group by first ».

\n\n

Important : First() lèvera une exception si le groupe est vide. Si cela est possible — utilisez FirstOrDefault().

\n\n

3. Comment calculer la somme, le nombre ou la moyenne par groupe ?

\n\n

Après un regroupement, il est souvent nécessaire non seulement de parcourir les éléments, mais aussi d’obtenir des valeurs agrégées. Par exemple, la somme des scores par groupe ou la moyenne des scores.

\n\n

Utilisons Sum, Count, Average :

\n\n
var groupStats = students\n    .GroupBy(s => s.Group)\n    .Select(g => new\n    {\n        Group = g.Key,\n        Count = g.Count(),\n        TotalScore = g.Sum(s => s.Score),\n        AverageScore = g.Average(s => s.Score)\n    });\n\nforeach (var stat in groupStats)\n{\n    Console.WriteLine($"Groupe {stat.Group}: {stat.Count} étudiants, somme {stat.TotalScore}, moyenne {stat.AverageScore:F2}");\n}
\n\n

Résultat :

\n
Groupe A: 2 étudiants, somme 163, moyenne 81.50\nGroupe B: 2 étudiants, somme 182, moyenne 91.00
\n\n

On peut aussi utiliser Min et Max — dans

Blogs

Book Recommendations