Comment puis-je obtenir une distincte, liste ordonnée des noms d'un DataTable en utilisant LINQ?

voix
83

J'ai DataTableune Namecolonne. Je veux générer une collection des noms uniques classés par ordre alphabétique. La requête suivante ignore l' ordre par clause.

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

Pourquoi ne le orderbypas s'appliqué?

Créé 01/08/2008 à 14:14
source utilisateur
Dans d'autres langues...                            


8 réponses

voix
51

Le problème est que l'opérateur Distinct ne donne pas qu'il maintiendra l'ordre initial des valeurs.

Ainsi, votre requête devra travailler comme ça

var names = (from DataRow dr in dataTable.Rows
             select (string)dr["Name"]).Distinct().OrderBy( name => name );
Créé 01/08/2008 à 14:18
source utilisateur

voix
30

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

  1. Tout d' abord, sélectionnez vos données dans une nouvelle liste, nous allons l' appeler x1, faire une projection si on le souhaite
  2. Ensuite, créez une liste distincte, à partir x1en x2utilisant toute distinction que vous avez besoin
  3. Enfin, créer une liste ordonnée, à partir x2en x3, le tri par ce que vous désirez
Créé 04/09/2008 à 03:57
source utilisateur

voix
8
var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);
Créé 05/12/2008 à 02:08
source utilisateur

voix
5

Essayez les éléments suivants:

dataTable.Rows.Cast<DataRow>().select(dr => dr["Name"].ToString()).Distinct().OrderBy(name => name);
Créé 28/04/2013 à 10:27
source utilisateur

voix
1

Effectuez les opérations suivantes

var names = (from dr in dataTable.Rows
             select (string)dr["Name"]).Distinct().OrderBy(name => name);

cela devrait fonctionner pour ce dont vous avez besoin.

Créé 07/08/2008 à 03:35
source utilisateur

voix
0
dataTable.Rows.Cast<DataRow>().GrpBy(g => g["Name"]).Select(s => s.First()).OrBy(o => o["Name"]);
Créé 30/09/2019 à 11:48
source utilisateur

voix
0

Vous pouvez utiliser quelque chose comme ça:

dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
Créé 25/06/2018 à 10:56
source utilisateur

voix
0

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

OrderBy doit être l'opération finale.

Créé 30/01/2018 à 16:19
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more