Comment obtenir une liste distincte et ordonnée de noms à partir d’un DataTable avec LINQ

Utiliser LINQ pour manipuler des données d’un DataTable peut être très puissant, mais cela peut aussi mener à des résultats inattendus si cela n’est pas géré correctement. Dans cet article de blog, nous allons explorer un problème courant : générer une liste ordonnée de noms uniques à partir d’un DataTable. Nous allons examiner pourquoi une requête simple peut ne pas livrer l’ordre attendu et fournir une solution structurée.

Le Problème

Vous avez un DataTable contenant une colonne pour les noms, et vous souhaitez extraire une collection distincte de ces noms triés par ordre alphabétique. Une requête LINQ typique ressemble à ceci :

var names =
    (from DataRow dr in dataTable.Rows
    orderby (string)dr["Name"]
    select (string)dr["Name"]).Distinct();

À première vue, cela semble correct, mais vous pourriez remarquer que la clause orderby ne respecte pas l’ordre attendu dans le résultat final. Pourquoi cela ?

Comprendre le Problème

Lorsque vous utilisez la méthode Distinct() après avoir ordonné, cela peut souvent mener à confusion. Le processus d’obtention de valeurs distinctes est séparé de la manière dont les valeurs sont ordonnées.

Pourquoi l’Ordre Peut Ne Pas Fonctionner

  • La méthode Distinct() pourrait ne pas maintenir l’ordre établi par le orderby. Lorsqu’elle traite les données, elle se concentre uniquement sur les valeurs distinctes sans conserver l’ordre.

Pour obtenir à la fois la distinctivité et l’ordre, nous devons ajuster notre approche LINQ.

Une Solution Structurée

Pour garantir que vous obteniez à la fois des noms distincts et ordonnés, vous pouvez diviser le processus en trois étapes claires :

Étape 1 : Sélectionner les Noms dans une Nouvelle Liste

Tout d’abord, rassembler tous les noms dans une collection. Vous pouvez faire une projection lors de cette étape si nécessaire.

var x1 = 
    (from DataRow dr in dataTable.Rows
    select (string)dr["Name"]).ToList();

Étape 2 : Créer une Liste Distincte

Ensuite, créez une liste distincte à partir de la collection obtenue à l’étape 1. Cette étape permettra de filtrer les doublons.

var x2 = x1.Distinct().ToList();

Étape 3 : Créer une Liste Ordonnée

Enfin, prenez la liste distincte et classez-la par ordre alphabétique.

var orderedNames = x2.OrderBy(name => name).ToList();

Exemple de Code Complet

Voici à quoi ressemble le code complet lorsqu’il est mis ensemble :

var x1 = 
    (from DataRow dr in dataTable.Rows
    select (string)dr["Name"]).ToList();

var x2 = x1.Distinct().ToList();

var orderedNames = x2.OrderBy(name => name).ToList();

Conclusion

En décomposant la requête LINQ en plusieurs parties, nous pouvons efficacement obtenir une liste distincte de noms d’un DataTable qui est également ordonnée par ordre alphabétique. Cette méthode améliore à la fois la lisibilité et la maintenabilité de votre code, garantissant que chaque étape du processus est claire et logique.

Cette approche structurée garantit que vous extrayez les noms uniques dans l’ordre que vous désirez, en faisant une solution fiable dans vos projets de développement C#.

N’hésitez pas à essayer cette méthode et à voir comment elle fonctionne pour vos besoins de données !