Chargement...

LINQ Avancé en C# (GroupBy, Join, Aggregate)

Apprenez LINQ avancé en C# avec GroupBy, Join et Aggregate pour effectuer des requêtes complexes.

LINQ ne se limite pas au filtrage et au tri de base. Pour un traitement de données plus complexe, il propose des opérateurs avancés comme GroupBy, Join et Aggregate. Dans cet article, nous allons voir comment utiliser ces opérateurs avec des exemples.


GroupBy

GroupBy regroupe les éléments d’une collection selon une propriété spécifiée. Vous pouvez ensuite exécuter des requêtes sur ces groupes afin d’obtenir des informations statistiques.


using System;
using System.Linq;
using System.Collections.Generic;

var etudiants = new List<(string Nom, string Ville)>
{
    ("Jean", "Paris"),
    ("Marie", "Lyon"),
    ("Michel", "Paris"),
    ("Sophie", "Lyon"),
    ("David", "Marseille")
};

// Regrouper les étudiants par ville
var groupes = etudiants.GroupBy(e => e.Ville);

foreach (var groupe in groupes)
{
    Console.WriteLine($"Ville: {groupe.Key} - Nombre d'étudiants: {groupe.Count()}");
    foreach (var etu in groupe)
        Console.WriteLine($"  {etu.Nom}");
}

// Sortie :
// Ville: Paris - Nombre d'étudiants: 2
//   Jean
//   Michel
// Ville: Lyon - Nombre d'étudiants: 2
//   Marie
//   Sophie
// Ville: Marseille - Nombre d'étudiants: 1
//   David

Join

Join fonctionne de manière similaire à INNER JOIN en SQL et permet de combiner deux collections à partir d’une clé commune.


var etudiants = new List<(int Id, string Nom)>
{
    (1, "Jean"),
    (2, "Marie"),
    (3, "Michel")
};

var notes = new List<(int EtuId, int Note)>
{
    (1, 90),
    (2, 75),
    (3, 82)
};

// Associer étudiants et notes avec Join
var resultat = etudiants.Join(
    notes,
    e => e.Id,            // clé externe
    n => n.EtuId,         // clé interne
    (e, n) => new { e.Nom, n.Note }
);

foreach (var item in resultat)
    Console.WriteLine($"{item.Nom} → {item.Note}");

// Sortie :
// Jean → 90
// Marie → 75
// Michel → 82

Aggregate

Aggregate effectue une opération cumulative sur une collection. Il fonctionne comme une boucle, en mettant à jour une valeur accumulée pour produire un résultat final.


var nombres = new List<int> { 2, 3, 4, 5 };

// Multiplier tous les nombres
int produit = nombres.Aggregate((acc, n) => acc * n);
Console.WriteLine(produit); // 120

// Construire une chaîne à partir des nombres
string texte = nombres.Aggregate("Nombres:", (acc, n) => acc + " " + n);
Console.WriteLine(texte);
// Sortie : Nombres: 2 3 4 5

Exemple d’application : Rapport de ventes

Dans l’exemple suivant, les enregistrements de ventes sont traités en utilisant GroupBy, Join et Aggregate ensemble.


public class Produit
{
    public int Id { get; set; }
    public string Nom { get; set; } = string.Empty;
}

public class Vente
{
    public int ProduitId { get; set; }
    public int Quantite { get; set; }
    public decimal Prix { get; set; }
}

class Program
{
    static void Main()
    {
        var produits = new List<Produit>
        {
            new Produit { Id = 1, Nom = "Ordinateur portable" },
            new Produit { Id = 2, Nom = "Téléphone" },
            new Produit { Id = 3, Nom = "Tablette" }
        };

        var ventes = new List<Vente>
        {
            new Vente { ProduitId = 1, Quantite = 2, Prix = 1000 },
            new Vente { ProduitId = 2, Quantite = 5, Prix = 500 },
            new Vente { ProduitId = 1, Quantite = 1, Prix = 950 },
            new Vente { ProduitId = 3, Quantite = 3, Prix = 300 }
        };

        // Associer produits et ventes
        var rapport = produits.Join(
            ventes,
            p => p.Id,
            v => v.ProduitId,
            (p, v) => new { p.Nom, v.Quantite, v.Prix }
        );

        // Regrouper par produit
        var rapportGroupe = rapport.GroupBy(r => r.Nom);

        foreach (var groupe in rapportGroupe)
        {
            var chiffreAffaires = groupe.Aggregate(0m, (acc, r) => acc + (r.Quantite * r.Prix));
            Console.WriteLine($"{groupe.Key} → Ventes: {groupe.Count()}, Chiffre d’affaires: {chiffreAffaires} EUR");
        }
    }
}

// Exemple de sortie :
// Ordinateur portable → Ventes: 2, Chiffre d’affaires: 2950 EUR
// Téléphone → Ventes: 1, Chiffre d’affaires: 2500 EUR
// Tablette → Ventes: 1, Chiffre d’affaires: 900 EUR

Résumé (TL;DR)

  • GroupBy : Regroupe les éléments selon une clé.
  • Join : Combine deux collections via une clé commune.
  • Aggregate : Réalise une opération cumulative pour produire un résultat unique.
  • Ces opérateurs sont très utiles pour les scénarios de reporting et d’analyse de données.

Articles connexes