SELECT et projection
Transformez les données pour leur donner de nouvelles formes.
SELECT et projection est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 2 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.
Ce que signifie la projection
Select transforme chaque élément d’une séquence en une nouvelle forme. C’est ce qu’on appelle une projection.
Il reçoit une lambda qui associe un élément à un résultat et renvoie une séquence de ces résultats, sans modifier la source.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4 };
var squares = nums.Select(n => n * n);
Console.WriteLine(string.Join(", ", squares));Modifier le type
La projection peut modifier entièrement le type des éléments. Transformer int en string produit un IEnumerable<string>.
Le type de sortie est déduit du type de retour de la lambda, le compilateur le suit donc pour vous.
using System;
using System.Linq;
int[] nums = { 10, 20, 30 };
var labels = nums.Select(n => $"Item #{n}");
foreach (var l in labels) Console.WriteLine(l);Projeter des propriétés
Une utilisation fréquente consiste à extraire une propriété précise des objets. Select(p => p.Name) transforme une liste d’objets en une liste de noms.
Cela réduit les données à ce dont vous avez besoin avant un traitement ou un affichage ultérieur.
using System;
using System.Linq;
using System.Collections.Generic;
record User(string Name, int Age);
var users = new List<User> { new("Ana", 30), new("Bo", 25) };
var names = users.Select(u => u.Name);
Console.WriteLine(string.Join(", ", names));Résultats de type anonyme
Vous pouvez projeter vers un type anonyme pour conserver plusieurs champs ensemble. Utilisez new { ... } dans la lambda.
Le compilateur génère à la volée une classe dotée de propriétés en lecture seule, ce qui est idéal pour définir la forme de résultats intermédiaires.
using System;
using System.Linq;
using System.Collections.Generic;
record User(string Name, int Age);
var users = new List<User> { new("Ana", 30), new("Bo", 25) };
var shaped = users.Select(u => new { u.Name, IsAdult = u.Age >= 18 });
foreach (var s in shaped) Console.WriteLine($"{s.Name}:{s.IsAdult}");Select avec un indice
Comme Where, Select possède une surcharge qui expose l’indice commençant à zéro. La lambda reçoit (element, index).
C’est idéal pour numéroter les éléments ou associer chaque valeur à sa position.
using System;
using System.Linq;
string[] tasks = { "Wake", "Eat", "Code" };
var numbered = tasks.Select((t, i) => $"{i + 1}. {t}");
foreach (var n in numbered) Console.WriteLine(n);Select dans la syntaxe des requêtes
Dans la syntaxe des requêtes, la clause select effectue la projection. Vous pouvez sélectionner l’élément lui-même ou toute expression fondée sur celui-ci.
Combinez-la avec where pour filtrer et définir la forme des données dans une seule requête lisible.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4, 5 };
var result = from n in nums
where n % 2 == 1
select n * 10;
Console.WriteLine(string.Join(", ", result));SelectMany aplatit
Lorsque chaque élément est associé à une collection, Select produit une séquence de séquences. SelectMany les aplatit en une seule séquence.
C’est l’équivalent LINQ d’une boucle imbriquée qui concatène les résultats internes.
using System;
using System.Linq;
using System.Collections.Generic;
var groups = new List<int[]> { new[] {1, 2}, new[] {3, 4} };
var flat = groups.SelectMany(g => g);
Console.WriteLine(string.Join(", ", flat));La projection est également différée
Select suit également le modèle d’exécution différée. La lambda de transformation ne s’exécute que lorsque la séquence est énumérée.
Construire une projection est donc peu coûteux ; le travail est effectué lorsque vous parcourez ou matérialisez le résultat.
using System;
using System.Linq;
int runs = 0;
int[] nums = { 1, 2, 3 };
var q = nums.Select(n => { runs++; return n; });
Console.WriteLine($"Before: {runs}");
foreach (var _ in q) { }
Console.WriteLine($"After: {runs}");Filtrer puis projeter
L’ordre est important pour la clarté et l’efficacité : filtrez d’abord avec Where, puis projetez avec Select, afin de ne transformer que les éléments conservés.
Cette chaîne de traitement se lit de haut en bas et évite le travail de projection inutile.
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4, 5, 6 };
var result = nums.Where(n => n % 2 == 0)
.Select(n => n * n);
Console.WriteLine(string.Join(", ", result));Projeter vers un nouvel enregistrement
Au lieu de types anonymes, vous pouvez projeter vers un type nommé ou un record. C’est utile lorsque les résultats franchissent les limites d’une méthode, car les types anonymes ne peuvent pas être renvoyés sous un nom connu.
C’est également ainsi que l’on construit des objets de transfert de données à partir d’objets de domaine plus riches.
using System;
using System.Linq;
using System.Collections.Generic;
record User(string Name, int Age);
record Summary(string Name);
var users = new List<User> { new("Ana", 30) };
var dtos = users.Select(u => new Summary(u.Name));
foreach (var d in dtos) Console.WriteLine(d.Name);Select conserve l’ordre et le nombre
Contrairement à Where, Select n’ajoute ni ne supprime jamais d’éléments : il établit une correspondance un à un. La sortie possède le même nombre d’éléments et le même ordre que l’entrée.
Si vous avez besoin de moins d’éléments, filtrez ; si vous avez besoin de plusieurs éléments pour chacun, utilisez SelectMany.
using System;
using System.Linq;
int[] nums = { 5, 1, 9 };
var doubled = nums.Select(n => n * 2);
Console.WriteLine($"In:{nums.Length} Out:{doubled.Count()}");Vérification rapide
Choisissez l’opérateur adapté à la tâche.
Récapitulatif
Select projette chaque élément vers une nouvelle forme — une propriété, une chaîne de caractères, un type anonyme ou un enregistrement — en conservant le nombre et l’ordre dans une correspondance un à un. Il possède une surcharge avec indice et son exécution est différée.
SelectMany aplatit les séquences imbriquées. Nous allons maintenant trier et regrouper les données dont nous avons défini la forme.
Questions Fréquemment Posées
La leçon « SELECT et projection » est-elle gratuite ?
Oui — le texte complet de « SELECT et projection » 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 « SELECT et projection » ?
Transformez les données pour leur donner de nouvelles formes. 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 2 sur 4.
Combien de temps prend la leçon « SELECT et projection » ?
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