Comment obtenir une liste de noms distincte et ordonnée à partir d'un DataTable à l'aide de LINQ?


104

J'ai un DataTableavec unName colonne. Je souhaite générer une collection des noms uniques classés par ordre alphabétique. La requête suivante ignore la clause order by .

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

Pourquoi le orderby pas appliqué?

Réponses:


37

Pour le rendre plus lisible et maintenable, vous pouvez également le diviser en plusieurs instructions LINQ.

  1. Tout d'abord, sélectionnez vos données dans une nouvelle liste, appelons-la x1 , faites une projection si vous le souhaitez
  2. Ensuite, créez une liste distincte, de x1versx2 , en utilisant la distinction dont vous avez besoin
  3. Enfin, créez une liste ordonnée, de x2dans x3, en triant ce que vous désirez

55

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 );

11
var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);

8

Essayez ce qui suit:

dataTable.Rows.Cast<DataRow>().select(dr => dr["Name"].ToString()).Distinct().OrderBy(name => name);

3

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.


2

Pour résumer: toutes les réponses ont quelque chose en commun.

OrderBy doit être l'opération finale.


2

Vous pouvez utiliser quelque chose comme ça:

dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.