c# - usar - ¿Cómo obtengo una lista ordenada de nombres de una DataTable usando LINQ?
recorrer datatable c# linq (7)
Tengo una
DataTable
con una columna
Name
.
Quiero generar una colección de nombres únicos ordenados alfabéticamente.
La siguiente consulta ignora el
orden por
cláusula.
var names =
(from DataRow dr in dataTable.Rows
orderby (string)dr["Name"]
select (string)dr["Name"]).Distinct();
¿Por qué no se hace cumplir el
orderby
?
Intenta lo siguiente
var names = (from dr in dataTable.Rows
select (string)dr["Name"]).Distinct().OrderBy(name => name);
Esto debería funcionar para lo que necesita.
Para hacerlo más legible y fácil de mantener, también puede dividirlo en varias instrucciones LINQ.
-
Primero, seleccione sus datos en una nueva lista, llamémosla
x1
, haga una proyección si lo desea -
Luego, cree una lista distinta, de
x1
ax2
, utilizando la distinción que necesite -
Finalmente, cree una lista ordenada, de
x2
ax3
, ordenando por lo que desee
Para resumir: todas las respuestas tienen algo en común.
OrderBy necesita ser la operación final.
Pruebe lo siguiente:
dataTable.Rows.Cast<DataRow>().select(dr => dr["Name"].ToString()).Distinct().OrderBy(name => name);
Puedes usar algo así:
dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
El problema es que el operador Distinct no garantiza que mantendrá el orden original de valores.
Entonces su consulta tendrá que funcionar así
var names = (from DataRow dr in dataTable.Rows
select (string)dr["Name"]).Distinct().OrderBy( name => name );
var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);