0Pricing
C# Academy · Leçon

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

  1. WHERE et filtrage
  2. SELECT et projection
  3. OrderBy et regroupement
  4. Agrégats et ToList
← Retour à C# Academy