Como obtenho uma lista distinta e ordenada de nomes de um DataTable usando LINQ?


104

Eu tenho um DataTablecom uma Namecoluna. Desejo gerar uma coleção de nomes exclusivos ordenados alfabeticamente. A consulta a seguir ignora a cláusula order by .

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

Por que orderbynão é aplicado?

Respostas:


37

Para torná-lo mais legível e sustentável, você também pode dividi-lo em várias instruções LINQ.

  1. Primeiro, selecione seus dados em uma nova lista, vamos chamá-la x1, faça uma projeção se desejar
  2. Em seguida, crie uma lista distinta, de x1em x2, usando qualquer distinção que você precisa
  3. Por fim, crie uma lista ordenada, de x2em x3, classificando de acordo com o que você deseja

55

O problema é que o operador Distinto não garante que manterá a ordem original dos valores.

Portanto, sua consulta precisará funcionar assim

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

Experimente o seguinte:

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

3

Tente o seguinte

var names = (from dr in dataTable.Rows
             select (string)dr["Name"]).Distinct().OrderBy(name => name);

isso deve funcionar para o que você precisa.


2

Para resumir: todas as respostas têm algo em comum.

OrderBy precisa ser a operação final.


2

Você pode usar algo assim:

dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.