¿Cómo puedo obtener una distinta, lista ordenada de nombres a partir de una tabla de datos utilizando LINQ?

StackOverflow https://stackoverflow.com/questions/59

  •  08-06-2019
  •  | 
  •  

Pregunta

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

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

¿Por qué el orderby no se aplican?

¿Fue útil?

Solución

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

  1. En primer lugar, seleccione los datos en una lista de nuevo, vamos a llamar x1, hacer una proyección, si se desea
  2. A continuación, cree una lista distinct, de x1 en x2, usando cualquier distinción que usted requiere
  3. Por último, crear una lista ordenada, de x2 en x3, clasificación por lo que usted desea

Otros consejos

El problema es que las Distintas el operador no garantiza que va a mantener el orden original de valores.

Para su consulta se necesita para que funcione como esta

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

Probar las siguientes:

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

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 usted necesita.

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

OrderBy debe ser el final de la operación.

Usted puede usar algo como que:

dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top