¿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?

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

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 );

11
var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);

8

Pruebe lo siguiente:

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

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.


2

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

OrderBy debe ser la operación final.


2

Puedes usar algo como eso:

dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.