OrderBy et regroupement
Triez et regroupez les résultats.
OrderBy et regroupement est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C# Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C# Academy comprend 4 leçons au total.
Trier avec OrderBy
OrderBy trie une séquence par ordre croissant selon une clé que vous choisissez. La lambda renvoie la valeur utilisée pour le tri.
Il renvoie une nouvelle séquence triée et est stable : les éléments dont la clé est identique conservent leur ordre relatif d’origine.
using System;
using System.Linq;
int[] nums = { 4, 1, 3, 2 };
var sorted = nums.OrderBy(n => n);
Console.WriteLine(string.Join(", ", sorted));Ordre décroissant
OrderByDescending trie de la valeur la plus grande à la plus petite selon la clé sélectionnée.
Utilisez-le directement plutôt que de trier par ordre croissant puis d’inverser le résultat : il exprime clairement l’intention et effectue le tri en un seul parcours.
using System;
using System.Linq;
int[] scores = { 70, 95, 60, 88 };
var ranked = scores.OrderByDescending(s => s);
Console.WriteLine(string.Join(", ", ranked));Trier selon une propriété
Pour les objets, sélectionnez la propriété selon laquelle effectuer le tri. OrderBy(p => p.Age) trie les personnes de la plus jeune à la plus âgée.
La clé peut être de tout type comparable — nombres, chaînes de caractères, dates — ou de tout type qui implémente IComparable.
using System;
using System.Linq;
using System.Collections.Generic;
record P(string Name, int Age);
var people = new List<P> { new("Ana", 30), new("Bo", 22) };
var byAge = people.OrderBy(p => p.Age);
foreach (var p in byAge) Console.WriteLine(p.Name);Tri secondaire avec ThenBy
ThenBy ajoute un critère de départage. Après OrderBy, il trie les éléments qui ont la même clé principale selon une seconde clé.
Vous pouvez enchaîner plusieurs appels à ThenBy/ThenByDescending pour effectuer un tri à plusieurs niveaux.
using System;
using System.Linq;
using System.Collections.Generic;
record P(string Name, int Age);
var people = new List<P> { new("Bo", 30), new("Ana", 30), new("Cy", 22) };
var ordered = people.OrderBy(p => p.Age).ThenBy(p => p.Name);
foreach (var p in ordered) Console.WriteLine($"{p.Age} {p.Name}");Pourquoi ne pas utiliser un second OrderBy
Appeler OrderBy deux fois ne fournit pas de critère de départage : le second appel effectue un nouveau tri complet et annule le premier ordre.
Pour effectuer un tri par niveaux, utilisez toujours ThenBy après le premier OrderBy.
using System;
using System.Linq;
using System.Collections.Generic;
record P(string N, int A);
var ps = new List<P> { new("Bo", 30), new("Ana", 30) };
var wrong = ps.OrderBy(p => p.A).OrderBy(p => p.N);
foreach (var p in wrong) Console.WriteLine(p.N);Syntaxe de requête avec orderby
La syntaxe de requête dispose d'une clause orderby. Indiquez plusieurs clés séparées par des virgules, éventuellement suivies de descending.
orderby p.Age, p.Name descending trie d'abord par âge, puis par nom décroissant en cas d'égalité.
using System;
using System.Linq;
using System.Collections.Generic;
record P(string N, int A);
var ps = new List<P> { new("Bo", 30), new("Ana", 30), new("Cy", 22) };
var q = from p in ps orderby p.A, p.N select p.N;
Console.WriteLine(string.Join(", ", q));Regroupement avec GroupBy
GroupBy répartit une séquence en groupes qui partagent une clé. Il renvoie une séquence de IGrouping<TKey, TElement>.
Chaque groupe expose sa Key et peut lui-même être parcouru pour accéder aux éléments qu'il contient.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4, 5, 6 };
var groups = nums.GroupBy(n => n % 2 == 0 ? "even" : "odd");
foreach (var g in groups)
Console.WriteLine($"{g.Key}: {string.Join(\",\", g)}");Clé et éléments d'un groupe
La Key de chaque groupe identifie la partition, et parcourir le groupe fournit ses éléments. Vous pouvez appeler directement Count() sur un groupe.
C'est ainsi que vous créez des histogrammes, des comptages et des répartitions par catégorie.
using System;
using System.Linq;
string[] fruit = { "apple", "avocado", "banana", "cherry" };
var byLetter = fruit.GroupBy(f => f[0]);
foreach (var g in byLetter)
Console.WriteLine($"{g.Key}: {g.Count()}");Regrouper puis projeter
Un schéma courant consiste à projeter chaque groupe dans un objet récapitulatif en utilisant Select après GroupBy.
Vous lisez la Key et agrégez les éléments, par exemple en calculant un nombre ou une somme pour chaque groupe.
using System;
using System.Linq;
using System.Collections.Generic;
record Sale(string City, int Amt);
var sales = new List<Sale> { new("NY", 5), new("LA", 3), new("NY", 2) };
var totals = sales.GroupBy(s => s.City)
.Select(g => new { g.Key, Sum = g.Sum(x => x.Amt) });
foreach (var t in totals) Console.WriteLine($"{t.Key}={t.Sum}");GroupBy avec un sélecteur d'éléments
GroupBy possède une surcharge qui accepte une seconde expression lambda, appelée sélecteur d'éléments : elle détermine ce que chaque groupe stocke, et pas seulement la façon dont il est défini.
Ici, nous regroupons les éléments par ville, mais nous ne stockons que les montants.
using System;
using System.Linq;
using System.Collections.Generic;
record Sale(string City, int Amt);
var sales = new List<Sale> { new("NY", 5), new("NY", 2) };
var g = sales.GroupBy(s => s.City, s => s.Amt);
foreach (var grp in g)
Console.WriteLine($"{grp.Key}: {string.Join(\",\", grp)}");Le tri et le regroupement sont différés
OrderBy et GroupBy utilisent tous deux l'exécution différée : ils s'exécutent lorsque la séquence est parcourue. Notez toutefois que le tri et le regroupement doivent consommer la source entière avant de produire le premier élément.
Contrairement à Where, ils ne traitent donc pas les données en continu : le coût est supporté dès la première itération.
using System;
using System.Linq;
int[] nums = { 3, 1, 2 };
var q = nums.OrderBy(n => n);
Console.WriteLine("Query built");
Console.WriteLine(string.Join(", ", q));Vérification rapide
Réfléchissez au tri à plusieurs niveaux.
Récapitulatif
OrderBy/OrderByDescending trient selon une clé ; ThenBy ajoute des critères de départage. Un second OrderBy effectue un nouveau tri et ne constitue pas un critère de départage.
GroupBy répartit les éléments dans des objets IGrouping contenant une Key et des éléments, souvent ensuite projetés en résumés. Les deux opérations sont différées, mais consomment la source entière. Nous allons maintenant agréger et matérialiser les résultats.
Questions Fréquemment Posées
La leçon « OrderBy et regroupement » est-elle gratuite ?
Oui — le texte complet de « OrderBy et regroupement » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C# Academy, passe à CoddyKit PRO. Le cours C# Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « OrderBy et regroupement » ?
Triez et regroupez les résultats. Tu pratiques C# Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C# Academy ?
Aucune expérience préalable n'est requise. C# Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « OrderBy et regroupement » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C# Academy ?
Oui. Chaque leçon C# Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- WHERE et filtrage
- SELECT et projection
- OrderBy et regroupement
- Agrégats et ToList