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é?

Bob
la source

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
a7drew
la source
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 );
Bob
la source
11
var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);
Peter Mortensen
la source
8

Essayez ce qui suit:

dataTable.Rows.Cast<DataRow>().select(dr => dr["Name"].ToString()).Distinct().OrderBy(name => name);
Gavin Fang
la source
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.

Nick Berardi
la source
2

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

OrderBy doit être l'opération finale.

Philippe Raath
la source
2

Vous pouvez utiliser quelque chose comme ça:

dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
Presto
la source