¿Cómo obtengo una lista distinta y ordenada de nombres de una DataTable usando LINQ?


Tengo una DataTable con una columna Name. Quiero generar una colección de nombres únicos ordenados alfabéticamente. La siguiente consulta ignora la cláusula order by.

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

¿Por qué el orderby no se hace cumplir?

Author: Philip Raath, 2008-08-01

7 answers

Para que sea más legible y fácil de mantener, también puede dividirlo en varias sentencias LINQ.

  1. Primero, seleccione sus datos en una nueva lista, llamémoslos x1, haga una proyección si lo desea
  2. A continuación, cree una lista distinta, de x1 a x2, usando cualquier distinción que necesite
  3. Finalmente, crea una lista ordenada, de x2 a x3, ordenando por lo que desees
 31
Author: a7drew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-14 12:22:39

El problema es que los Distintos operador no concede que lo hará mantener el orden original de valor.

Así que tu consulta tendrá que funcionar así

var names = (from DataRow dr in dataTable.Rows
             select (string)dr["Name"]).Distinct().OrderBy( name => name );
 53
Author: Bob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-19 23:17:56
var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);
 8
Author: Peter Mortensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-08 15:41:14

Pruebe lo siguiente:

dataTable.Rows.Cast<DataRow>().select(dr => dr["Name"].ToString()).Distinct().OrderBy(name => name);
 5
Author: Gavin Fang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-28 06:08:21

Intente lo siguiente

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

Esto debería funcionar para lo que necesitas.

 1
Author: Nick Berardi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-14 07:44:43

Abstract: todas las respuestas tienen algo en común.

OrderBy debe ser la operación final.

 0
Author: Philip Raath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-30 16:19:51

Puedes usar algo así:

dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
 0
Author: Presto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-25 10:56:10