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

104

Tengo una DataTablecon una Namecolumna. 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é orderbyno se hace cumplir?

Beto
fuente

Respuestas:

37

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

  1. Primero, seleccione sus datos en una nueva lista, llamémosla x1 , haga una proyección si lo desea
  2. A continuación, cree una lista distinta, desde x1dentro x2, utilizando la distinción que necesite
  3. Finalmente, cree una lista ordenada, desde x2dentro x3, ordenando por lo que desee
a7drew
fuente
55

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

Entonces su consulta deberá funcionar así

var names = (from DataRow dr in dataTable.Rows
             select (string)dr["Name"]).Distinct().OrderBy( name => name );
Beto
fuente
11
var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);
Peter Mortensen
fuente
8

Pruebe lo siguiente:

dataTable.Rows.Cast<DataRow>().select(dr => dr["Name"].ToString()).Distinct().OrderBy(name => name);
Gavin Fang
fuente
3

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

Nick Berardi
fuente
2

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

OrderBy debe ser la operación final.

Philip Raath
fuente
2

Puedes usar algo como eso:

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