Comment puis-je obtenir une liste distincte et ordonnée de noms à partir d'un DataTable à l'aide de LINQ ?
Question
j'ai un DataTable
avec un Name
colonne.Je souhaite générer une collection de noms uniques classés par ordre alphabétique.La requête suivante ignore le commandé par clause.
var names =
(from DataRow dr in dataTable.Rows
orderby (string)dr["Name"]
select (string)dr["Name"]).Distinct();
Pourquoi le orderby
ne soit pas appliqué ?
La solution
Pour le rendre plus lisible et maintenable, vous pouvez également le diviser en plusieurs instructions LINQ.
- Tout d'abord, sélectionnez vos données dans une nouvelle liste, appelons-la
x1
, faites une projection si vous le souhaitez - Ensuite, créez une liste distincte, de
x1
dansx2
, en utilisant la distinction dont vous avez besoin - Enfin, créez une liste ordonnée, à partir de
x2
dansx3
, en triant selon ce que vous désirez
Autres conseils
Le problème est que l'opérateur distinct n'accorde pas qu'il conservera l'ordre d'origine des valeurs.
Votre requête devra donc fonctionner comme ceci
var names = (from DataRow dr in dataTable.Rows
select (string)dr["Name"]).Distinct().OrderBy( name => name );
var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);
Essayez ce qui suit :
dataTable.Rows.Cast<DataRow>().select(dr => dr["Name"].ToString()).Distinct().OrderBy(name => name);
Essayez ce qui suit
var names = (from dr in dataTable.Rows
select (string)dr["Name"]).Distinct().OrderBy(name => name);
cela devrait fonctionner pour ce dont vous avez besoin.
Pour résumer :toutes les réponses ont quelque chose en commun.
OrderBy doit être l’opération finale.
Vous pouvez utiliser quelque chose comme ça :
dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);