HashSet et unicité
Suivez les valeurs distinctes.
HashSet et unicité 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.
Qu'est-ce qu'un HashSet ?
HashSet<T> stocke une collection de valeurs uniques, sans doublons. L'ajout d'une valeur déjà présente ne fait tout simplement rien.
Comme un dictionnaire, il repose sur une table de hachage ; les tests d'appartenance s'effectuent donc en O(1) en moyenne. Il ne conserve pas l'ordre d'insertion.
using System.Collections.Generic;
var seen = new HashSet<int>();
seen.Add(1);
seen.Add(1); // ignored, still one elementAdd renvoie un booléen
Add renvoie true si la valeur était nouvelle et false si elle était déjà présente.
Cette valeur de retour permet de détecter les doublons en une seule étape, sans vérification distincte avec Contains.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var set = new HashSet<string>();
Console.WriteLine(set.Add("a")); // True
Console.WriteLine(set.Add("a")); // False
}
}Tests d'appartenance rapides
Contains sur un HashSet s'effectue en O(1) en moyenne, contre O(n) sur une List.
Lorsque vous demandez régulièrement « ai-je déjà vu cette valeur ? », un ensemble est l'outil approprié. L'écart de vitesse s'accentue considérablement à mesure que la collection s'agrandit.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var ids = new HashSet<int> { 10, 20, 30 };
Console.WriteLine(ids.Contains(20)); // True
Console.WriteLine(ids.Contains(99)); // False
}
}Suppression des doublons d'une liste
Tâche courante : prendre une liste et ne conserver que les valeurs distinctes. Construire un HashSet à partir de la liste effectue cela en O(n).
L'ensemble obtenu contient chaque valeur une seule fois. Si vous avez besoin de récupérer une liste, recréez-la ainsi : new List<int>(set).
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var nums = new List<int> { 1, 2, 2, 3, 3, 3 };
var unique = new HashSet<int>(nums);
Console.WriteLine(unique.Count); // 3
}
}Union
UnionWith ajoute chaque élément d'une autre collection en ignorant les doublons. Le résultat contient tout ce qui provient des deux collections.
Cela modifie l'ensemble sur place. C'est bien plus propre que de parcourir les éléments et d'appeler vous-même Add pour chacun.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var a = new HashSet<int> { 1, 2, 3 };
a.UnionWith(new[] { 3, 4, 5 });
Console.WriteLine(a.Count); // 5
}
}Intersection
IntersectWith conserve uniquement les éléments qui apparaissent également dans l'autre collection et élimine les autres.
Utilisez-le pour trouver les éléments communs, par exemple les balises partagées par deux articles ou les utilisateurs présents dans chacun de deux groupes.
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var a = new HashSet<int> { 1, 2, 3, 4 };
a.IntersectWith(new[] { 2, 4, 6 });
Console.WriteLine(string.Join(",", a)); // 2,4
}
}Différence
ExceptWith supprime de l'ensemble tout élément présent dans l'autre collection, en laissant ceux qui sont propres à l'ensemble.
C'est l'opération de soustraction d'ensembles : « éléments présents dans A, mais pas dans B ». Elle est idéale pour calculer ce qui a changé ou ce qu'il reste à traiter.
var a = new HashSet<int> { 1, 2, 3, 4 };
a.ExceptWith(new[] { 2, 4 });
// a now contains 1 and 3Sous-ensemble et sur-ensemble
IsSubsetOf et IsSupersetOf testent les relations d'inclusion entre ensembles et renvoient un bool.
Overlaps vérifie si un élément quelconque est commun, et SetEquals vérifie si deux ensembles contiennent exactement les mêmes éléments, quel que soit leur ordre.
var a = new HashSet<int> { 1, 2 };
var b = new HashSet<int> { 1, 2, 3 };
bool sub = a.IsSubsetOf(b); // true
bool ov = a.Overlaps(b); // trueÉgalité des éléments
L'unicité dépend de GetHashCode et Equals du type d'élément, exactement comme pour les clés de dictionnaire.
Pour les types personnalisés, redéfinissez les deux méthodes ou utilisez un record ; sinon, deux objets logiquement égaux sont considérés comme distincts et se retrouvent tous deux dans l'ensemble.
var names = new HashSet<string>(
System.StringComparer.OrdinalIgnoreCase);
names.Add("Sam");
bool dup = !names.Add("SAM"); // true: treated as sameNi indexation ni ordre
Un HashSet n'offre aucun accès par index ; vous ne pouvez pas écrire set[0]. Vous pouvez uniquement l'énumérer avec foreach.
L'ordre d'énumération n'est pas garanti. Si vous avez besoin à la fois d'unicité et d'un ordre trié, utilisez SortedSet<T>, qui conserve les éléments triés au prix d'opérations en O(log n).
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var s = new SortedSet<int> { 3, 1, 2 };
Console.WriteLine(string.Join(",", s)); // 1,2,3
}
}Suivi des éléments déjà vus
Un modèle fréquent consiste à filtrer un flux afin que chaque valeur n'apparaisse qu'une seule fois. Ajoutez chaque valeur à un ensemble et n'agissez que lorsque Add renvoie true.
C'est plus clair et plus rapide que de vérifier une liste qui s'allonge, ce qui transforme un parcours en O(n²) en parcours en O(n).
using System;
using System.Collections.Generic;
class Program {
static void Main() {
var seen = new HashSet<int>();
foreach (int x in new[] { 1, 1, 2, 3, 2 })
if (seen.Add(x)) Console.Write(x + " ");
// prints 1 2 3
}
}Vérification rapide
Rappelez-vous ce qu'un HashSet garantit et le coût de ses recherches.
Récapitulatif
HashSet<T> stocke des valeurs uniques avec ajout, suppression et tests d'appartenance en O(1) en moyenne, mais sans ordre ni indexation.
Il est particulièrement adapté à la déduplication, aux vérifications rapides « ai-je déjà vu cette valeur ? » et à l'algèbre des ensembles via UnionWith, IntersectWith et ExceptWith. Les types d'éléments personnalisés doivent définir une égalité correcte.
Questions Fréquemment Posées
La leçon « HashSet et unicité » est-elle gratuite ?
Oui — le texte complet de « HashSet et unicité » 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 « HashSet et unicité » ?
Suivez les valeurs distinctes. 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 « HashSet et unicité » ?
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.