¿Cómo obtengo una lista de nombres clara y ordenada de un DataTable utilizando LINQ?

votos
83

Tengo una DataTablecon una Namecolumna. Quiero generar una colección de nombres únicos ordenados alfabéticamente. La siguiente consulta ignora la orden por cláusula.

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

¿Por qué orderbyno se aplica?

Publicado el 01/08/2008 a las 14:14
fuente por usuario
En otros idiomas...                            


8 respuestas

votos
51

El problema es que el operador Distinct no garantiza que mantendrá el orden de valores original.

Por lo tanto, su consulta tendrá que funcionar así

var names = (from DataRow dr in dataTable.Rows
             select (string)dr["Name"]).Distinct().OrderBy( name => name );
Respondida el 01/08/2008 a las 14:18
fuente por usuario

votos
30

Para hacerlo más legible y mantenible, también puede dividirlo en múltiples declaraciones LINQ.

  1. Primero, seleccione sus datos en una nueva lista, vamos a llamarlo x1, haga una proyección si lo desea
  2. A continuación, cree una lista distinta, desde x1dentro x2, usando la distinción que requiera
  3. Por último, crear una lista ordenada, desde x2dentro x3, la clasificación por lo que deseo
Respondida el 04/09/2008 a las 03:57
fuente por usuario

votos
8
var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);
Respondida el 05/12/2008 a las 02:08
fuente por usuario

votos
5

Pruebe lo siguiente:

dataTable.Rows.Cast<DataRow>().select(dr => dr["Name"].ToString()).Distinct().OrderBy(name => name);
Respondida el 28/04/2013 a las 10:27
fuente por usuario

votos
1

Pruebe 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.

Respondida el 07/08/2008 a las 03:35
fuente por usuario

votos
0
dataTable.Rows.Cast<DataRow>().GrpBy(g => g["Name"]).Select(s => s.First()).OrBy(o => o["Name"]);
Respondida el 30/09/2019 a las 11:48
fuente por usuario

votos
0

Puede usar algo así:

dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
Respondida el 25/06/2018 a las 10:56
fuente por usuario

votos
0

Para abstracto: todas las respuestas tienen algo en común.

OrdenarPor tiene que ser la operación final.

Respondida el 30/01/2018 a las 13:19
fuente por usuario

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