Leçon 18 - LINQ et Requêtes
Maîtrisez LINQ pour interroger et manipuler vos collections de données facilement.
Qu'est-ce que LINQ ?
LINQ (Language Integrated Query) permet de filtrer, trier et transformer des données directement en C#. C'est comme SQL mais intégré dans le langage.
C#
using System.Linq;
var nombres = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// Filtrer les nombres pairs
var pairs = nombres.Where(n => n % 2 == 0);
Console.WriteLine("Nombres pairs: " + string.Join(", ", pairs));
// Affiche: Nombres pairs: 2, 4, 6, 8, 10
Opérations de base
Where - Filtrer
Sélectionner seulement certains éléments :
C#
var prenoms = new List<string> { "Alice", "Bob", "Charlie", "David", "Emma" };
// Prénoms qui commencent par 'A'
var avecA = prenoms.Where(p => p.StartsWith("A"));
// Prénoms de plus de 4 lettres
var longs = prenoms.Where(p => p.Length > 4);
Console.WriteLine("Avec A: " + string.Join(", ", avecA)); // Alice
Console.WriteLine("Longs: " + string.Join(", ", longs)); // Alice, Charlie, David
Select - Transformer
Modifier les éléments d'une liste :
C#
var nombres = new List<int> { 1, 2, 3, 4, 5 };
// Doubler chaque nombre
var doubles = nombres.Select(n => n * 2);
// Créer des phrases
var phrases = nombres.Select(n => $"Le nombre {n}");
Console.WriteLine(string.Join(", ", doubles)); // 2, 4, 6, 8, 10
OrderBy - Trier
Mettre les éléments dans l'ordre :
C#
var prenoms = new List<string> { "Charlie", "Alice", "Bob" };
// Ordre alphabétique
var triés = prenoms.OrderBy(p => p);
// Ordre inverse
var inversés = prenoms.OrderByDescending(p => p);
Console.WriteLine(string.Join(", ", triés)); // Alice, Bob, Charlie
Console.WriteLine(string.Join(", ", inversés)); // Charlie, Bob, Alice
Chaîner les opérations
Vous pouvez combiner plusieurs opérations :
C#
var nombres = Enumerable.Range(1, 20); // 1 à 20
// Nombres pairs, doublés, triés par ordre décroissant, prendre les 5 premiers
var résultat = nombres
.Where(n => n % 2 == 0) // Filtrer les pairs
.Select(n => n * 2) // Doubler
.OrderByDescending(n => n) // Trier décroissant
.Take(5); // Prendre 5
Console.WriteLine(string.Join(", ", résultat));
// Affiche: 40, 36, 32, 28, 24
Calculs avec LINQ
Effectuer des calculs sur des listes :
C#
var notes = new List<int> { 15, 18, 12, 20, 14 };
int total = notes.Sum(); // 79
double moyenne = notes.Average(); // 15.8
int max = notes.Max(); // 20
int min = notes.Min(); // 12
int count = notes.Count(); // 5
Console.WriteLine($"Total: {total}");
Console.WriteLine($"Moyenne: {moyenne:F1}");
Console.WriteLine($"Meilleure note: {max}");
// Notes supérieures à la moyenne
var bonnesNotes = notes.Where(n => n > moyenne);
Console.WriteLine($"Bonnes notes: {string.Join(", ", bonnesNotes)}");
LINQ avec des objets
Utiliser LINQ sur des listes d'objets :
C#
class Produit
{
public string Nom { get; set; }
public decimal Prix { get; set; }
public string Categorie { get; set; }
}
var produits = new List<Produit>
{
new Produit { Nom = "Laptop", Prix = 999, Categorie = "Informatique" },
new Produit { Nom = "Souris", Prix = 29, Categorie = "Informatique" },
new Produit { Nom = "Bureau", Prix = 299, Categorie = "Mobilier" },
new Produit { Nom = "Chaise", Prix = 199, Categorie = "Mobilier" }
};
// Produits informatiques moins de 100€
var informatiquePasChers = produits
.Where(p => p.Categorie == "Informatique" && p.Prix < 100)
.Select(p => p.Nom);
// Prix moyen par catégorie
var prixMoyenInformatique = produits
.Where(p => p.Categorie == "Informatique")
.Average(p => p.Prix);
// Produit le plus cher
var plusCher = produits.OrderByDescending(p => p.Prix).First();
Console.WriteLine($"Produit le plus cher: {plusCher.Nom} à {plusCher.Prix}€");
📋 Méthodes LINQ essentielles :
- Where : Filtrer
- Select : Transformer
- OrderBy / OrderByDescending : Trier
- First / FirstOrDefault : Premier élément
- Take / Skip : Prendre/Ignorer N éléments
- Sum / Average / Min / Max / Count : Calculs
- Any / All : Vérifier conditions
Exercice pratique
Créez une liste d'étudiants avec leurs notes, et calculez la moyenne de la classe :
C#
class Etudiant
{
public string Nom { get; set; }
public int Note { get; set; }
}
static void Main()
{
var etudiants = new List<Etudiant>
{
new Etudiant { Nom = "Alice", Note = 18 },
new Etudiant { Nom = "Bob", Note = 12 },
new Etudiant { Nom = "Charlie", Note = 15 },
new Etudiant { Nom = "Diana", Note = 20 },
new Etudiant { Nom = "Emma", Note = 14 }
};
// Moyenne de la classe
double moyenne = etudiants.Average(e => e.Note);
Console.WriteLine($"Moyenne de la classe: {moyenne:F1}/20");
// Meilleur élève
var meilleur = etudiants.OrderByDescending(e => e.Note).First();
Console.WriteLine($"Meilleur élève: {meilleur.Nom} ({meilleur.Note}/20)");
// Étudiants au-dessus de la moyenne
var auDessus = etudiants
.Where(e => e.Note > moyenne)
.OrderByDescending(e => e.Note);
Console.WriteLine("\nÉtudiants au-dessus de la moyenne:");
foreach (var etudiant in auDessus)
{
Console.WriteLine($" - {etudiant.Nom}: {etudiant.Note}/20");
}
// Nombre d'étudiants qui ont la moyenne (≥10)
int nombreReussis = etudiants.Count(e => e.Note >= 10);
Console.WriteLine($"\n{nombreReussis}/{etudiants.Count} étudiants ont la moyenne");
}
/* Résultat:
Moyenne de la classe: 15.8/20
Meilleur élève: Diana (20/20)
Étudiants au-dessus de la moyenne:
- Diana: 20/20
- Alice: 18/20
5/5 étudiants ont la moyenne
*/