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?

Prumo
fonte

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
a7drew
fonte
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 );
Prumo
fonte
11
var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);
Peter Mortensen
fonte
8

Experimente o seguinte:

dataTable.Rows.Cast<DataRow>().select(dr => dr["Name"].ToString()).Distinct().OrderBy(name => name);
Gavin Fang
fonte
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.

Nick Berardi
fonte
2

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

OrderBy precisa ser a operação final.

Philip Raath
fonte
2

Você pode usar algo assim:

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