Notions de base LINQ en C# (Where, Select, OrderBy)
Apprenez les bases de LINQ en C# avec Where, Select et OrderBy pour filtrer, projeter et trier des collections, avec exemples.
En C#, LINQ (Language Integrated Query) est une fonctionnalité puissante qui facilite les requêtes sur les collections et les sources de données.
Avec LINQ, vous pouvez écrire des expressions similaires à SQL sur des tableaux, des listes, du XML ou des bases de données.
Dans cet article, nous allons voir les opérateurs LINQ de base : Where, Select et OrderBy.
Where
La méthode Where est utilisée pour filtrer les éléments qui satisfont une condition donnée.
Elle prend un prédicat (fonction qui retourne un bool).
using System;
using System.Linq;
using System.Collections.Generic;
var nombres = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// Sélectionner les nombres pairs
var pairs = nombres.Where(n => n % 2 == 0);
Console.WriteLine(string.Join(", ", pairs));
// Sortie : 2, 4, 6, 8, 10
Exécution différée (Deferred Execution) : Lorsque vous écrivez
var result = books.Where(...), la requête ne s’exécute pas immédiatement.
LINQ crée simplement une définition de requête. Le filtrage se produit lorsque le résultat
est énuméré (par exemple avec foreach) ou lorsque des méthodes comme
ToList(), ToArray() ou Count() sont appelées.
Exemple d’exécution différée
var nombres = new List<int>
{
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
};
var pairs = nombres.Where(n => n % 2 == 0);
// Modifier la collection après la définition de la requête
nombres.Add(11);
nombres.Add(12);
nombres.Add(13);
nombres.Add(14);
// La requête s’exécute ici
Console.WriteLine(string.Join(", ", pairs));
// Résultat : 2, 4, 6, 8, 10, 12, 14
Remarquez que 12 et 14 sont inclus dans le résultat,
même s’ils ont été ajoutés après l’instruction Where.
Cela s’explique par le fait que Where utilise l’exécution différée
et évalue la collection au moment de l’énumération.
Select
L’opérateur Select est utilisé pour transformer (projeter) chaque élément d’une collection.
Par exemple, générer les carrés des nombres ou sélectionner uniquement certaines propriétés d’objets.
// Carrés des nombres
var carres = nombres.Select(n => n * n);
Console.WriteLine(string.Join(", ", carres));
// Sortie : 1, 4, 9, 16, 25, 36, 49, 64, 81, 100
// Exemple avec des objets
var etudiants = new List<(int Id, string Nom)>
{
(1, "Jean"),
(2, "Marie"),
(3, "Michel")
};
// Sélectionner uniquement les noms
var noms = etudiants.Select(e => e.Nom);
Console.WriteLine(string.Join(", ", noms));
// Sortie : Jean, Marie, Michel
OrderBy
La méthode OrderBy trie les éléments selon une clé spécifiée.
Par défaut, elle trie par ordre croissant. Pour un tri décroissant, utilisez OrderByDescending.
var fruits = new List<string> { "Pomme", "Poire", "Banane", "Kiwi" };
// Trier par ordre alphabétique
var tries = fruits.OrderBy(f => f);
Console.WriteLine(string.Join(", ", tries));
// Sortie : Banane, Kiwi, Poire, Pomme
// Trier par longueur en ordre décroissant
var parLongueur = fruits.OrderByDescending(f => f.Length);
Console.WriteLine(string.Join(", ", parLongueur));
// Sortie : Banane, Pomme, Poire, Kiwi
Utiliser Where + Select + OrderBy ensemble
Les opérateurs LINQ sont souvent utilisés en chaîne. Dans l’exemple suivant : on filtre d’abord, puis on transforme, et enfin on trie.
var nombres2 = new List<int> { 10, 3, 7, 8, 2, 15, 6 };
// Obtenir les carrés des nombres supérieurs à 5, triés par ordre croissant
var resultat = nombres2
.Where(n => n > 5)
.Select(n => n * n)
.OrderBy(n => n);
Console.WriteLine(string.Join(", ", resultat));
// Sortie : 36, 49, 64, 100, 225
Exemple d’application : Liste de livres
Dans ce scénario, nous interrogeons une liste de livres avec LINQ :
filtrer les livres de plus de 200 pages (Where),
sélectionner uniquement les titres (Select),
et les trier par longueur de titre (OrderBy).
public class Livre
{
public string Titre { get; set; } = string.Empty;
public int Pages { get; set; }
}
class Program
{
static void Main()
{
var livres = new List<Livre>
{
new Livre { Titre = "Programmation C#", Pages = 350 },
new Livre { Titre = "Guide LINQ", Pages = 220 },
new Livre { Titre = "Nouvelles courtes", Pages = 120 },
new Livre { Titre = "Algorithmes", Pages = 400 }
};
var result = livres
.Where(l => l.Pages > 200)
.Select(l => l.Titre)
.OrderBy(t => t.Length);
Console.WriteLine("Livres sélectionnés :");
foreach (var titre in result)
Console.WriteLine(titre);
}
}
// Sortie :
// Livres sélectionnés :
// Guide LINQ
// Programmation C#
// Algorithmes
Résumé (TL;DR)
Where: Filtre les éléments.Select: Transforme (projette) les éléments.OrderBy: Trie les éléments (croissant/décroissant).- Les opérateurs peuvent être chaînés :
Where → Select → OrderBy. - LINQ facilite l’écriture de requêtes puissantes, proches du SQL, sur des collections.